我想在背景中将2-3 GB的大文件(视频(上传到服务器,并具有以下要求
第一种方法
-
如果Internet连接丢失和重新连接,则应恢复上传
-
上传甚至应该继续应用程序在后台
-
如果用户杀死应用程序并返回
,则应恢复上传
对于以上功能我实施的功能
-
用户选择文件
-
将文件分成1MB的块,并将所有块在磁盘上保存为文件
-
在每个块文件中创建上传任务,然后在后台会话中添加文件
上面的方法有效,但在某些情况下失败了
-
如果文件大于1GB,则创建块并在磁盘上写块投入内存异常
-
如果我想上传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。
- 调用上传数据终点并开始发送数据。
- 失败,调用上传状态端点以找出服务器实际获得的数据。
- 然后调用数据终点,然后开始从该偏移量发送数据,告诉服务器您启动的位置。(在服务器上,即使从那以后的长度增加了,才能安全起来。
- 完成后,请致电上传完成端点。
此体系结构还可以轻松显示状态栏。