iOS nsurlsession背景上传如何在背景中上传大文件



我想在背景中将2-3 GB的大文件(视频(上传到服务器,并具有以下要求

第一种方法

  1. 如果Internet连接丢失和重新连接,则应恢复上传

  2. 上传甚至应该继续应用程序在后台

  3. 如果用户杀死应用程序并返回

  4. ,则应恢复上传

对于以上功能我实施的功能

  1. 用户选择文件

  2. 将文件分成1MB的块,并将所有块在磁盘上保存为文件

  3. 在每个块文件中创建上传任务,然后在后台会话中添加文件

上面的方法有效,但在某些情况下失败了

  1. 如果文件大于1GB,则创建块并在磁盘上写块投入内存异常

  2. 如果我想上传1GB的文件,我需要额外的1 GB空间来创建块

第二种方法

上传原始文件而不创建块,在这种情况下,如果网络连接丢失或用户杀死应用程序

,我将无法恢复上传

我的问题是,在背景中上传大文件的最佳方法是什么,请记住所有这些要点

我知道已经问过这种类型的问题,但是它们都没有回答我的问题

我花了很多时间来实施此功能,但无法成功实施它,请帮助我或提出一些建议是完成上述积分的最佳方法

更新

我正在使用以下代码来创建块代码在Xamarin.ios中

public static void SplitFileInChunks( UploadFileInfo UploadFile )
{
        int i = -1;
        long chunkSize = UploadHelper.chunkSize;
        nuint dataLength = (System.nuint)chunkSize; 
        //var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string directoryPath = UploadHelper.UploadsDirectory;
        int chunkCount = 0;
        NSFileHandle fileHandleRead = NSFileHandle.OpenRead(UploadFile.FilePath);
        fileHandleRead.ReadInBackground();
        //fileHandleRead.WaitForDataInBackground();
        if (fileHandleRead == null)
            return;
        do
        {
            i++;
            ulong index = (ulong)(i * chunkSize);
            var filePath = Path.Combine(directoryPath, UploadFile.ContentGuide + "" + i.ToString());
            //fileHandleRead.SeekToFileOffset(index);
            NSData data = fileHandleRead.ReadDataOfLength(dataLength );
            Console.WriteLine(UploadFile.FileStatus);
            if (data.Length <= 0)
                continue;
            NSFileManager.DefaultManager.CreateFile(filePath, data, attr: null);

            NSError error;
            //data.Save(filePath, true, out error);
            chunkCount++;
            Console.WriteLine("Data Lenght" + data.Length);
            data.Dispose();
            Console.WriteLine("Chunk " + i);
        }
        while ( i * chunkSize <= UploadFile.Size && UploadFile.FileStatus != UploadFileStatus.Aborted );
        fileHandleRead.CloseFile();
        fileHandleRead.Dispose();
        Console.WriteLine("All Files Written sucessuflly");
        UploadFile.TotalChunksCount = chunkCount;
    }

肯定会起作用,但是如果您控制了另一端的软件,则可以做得更好:

  • 在服务器端:

    • 提供仅提供唯一ID的上传开始端点(URL(。
    • 提供一个上传数据端点,该终点采用唯一的ID,一个帖子主体和一个可选的启动字节偏移,并将数据写入服务器上的临时文件。
    • 提供一个上传状态端点,该端点获取唯一ID并返回到目前为止磁盘上存储的数据量。
    • 提供上传成品端点。
  • 在客户端:

    • 调用开始端点并获取上传的ID。
    • 调用上传数据终点并开始发送数据。
    • 失败,调用上传状态端点以找出服务器实际获得的数据。
    • 然后调用数据终点,然后开始从该偏移量发送数据,告诉服务器您启动的位置。(在服务器上,即使从那以后的长度增加了,才能安全起来。
    • 完成后,请致电上传完成端点。

此体系结构还可以轻松显示状态栏。

相关内容

  • 没有找到相关文章

最新更新