【发布时间】:2017-04-24 14:34:55
【问题描述】:
我想将 2-3 GB 的大文件(视频)上传到后台服务器,要求如下
第一种方法
如果互联网连接丢失并重新连接,则应继续上传
即使应用程序在后台,也应该继续上传
如果用户杀死应用程序并返回,上传应该恢复
对于我已经实现的上述功能
用户选择文件
将文件拆分成 1MB 的 Chunks,并将磁盘上的所有 Chunks 保存为文件
针对每个块文件创建上传任务并在后台会话中添加文件
上述方法有效,但在某些情况下失败
如果文件大于 1GB 在磁盘上创建块和写入块 抛出内存异常
如果我想上传 1GB 的文件,我需要额外的 1GB 空间来创建块
第二种方法
在不创建块的情况下上传原始文件,在这种情况下,如果网络连接丢失或用户终止应用程序,我将无法继续上传
我的问题是在后台上传大文件的最佳方式是记住所有这些要点
我知道已经有人问过这类问题,但没有人回答我的问题
我花了很多时间来实现它但无法成功实现它请帮助我或提出一些建议来完成上述几点的最佳方法是什么
更新
我正在使用以下代码创建块 代码在 Xamarin.IOS 中,但如果有人在 Objective C 或 Swift 中提供解释,我很好
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;
}
【问题讨论】:
-
是的,我正在使用后台会话,但要在磁盘上保存块我需要额外的空间,因为据我所知,后台的 NSURLsession 仅适用于 NSURL.FromFileName
-
那么有没有其他方法可以克服这个问题,比如上传原始文件并支持恢复
-
我已尝试将其添加到 Auto
ReleasePool块中,但没有成功
标签: ios nsurlsession nsurlsessionuploadtask