Я хочу загружать большие файлы (видео) размером 2-3 ГБ на сервер в фоновом режиме со следующими требованиями
Первый метод
Загрузка должна возобновиться, если подключение к Интернету потеряно и снова подключено
Загрузка должна продолжаться, даже если приложение находится в фоновом режиме.
Загрузка должна возобновиться, если пользователь убьет приложение и вернется
для вышеуказанных функций, которые я реализовал
Пользователь выбирает файл
Разделите файл на куски по 1 МБ и сохраните все куски на диске как файл.
Создайте задачу загрузки для каждого файла фрагмента и добавьте файл в фоновый сеанс.
Вышеупомянутый метод работает, но в некоторых случаях не работает
Если размер файла превышает 1 ГБ, создание фрагментов и запись фрагментов на диск вызывает исключение памяти
Если я хочу загрузить файл размером 1 ГБ, мне нужно дополнительное пространство 1 ГБ для создания фрагментов.
Второй метод
Загрузите исходный файл без создания фрагментов, в этом случае я не смогу возобновить загрузку, если сетевое соединение потеряно или пользователь уничтожит приложение.
Мой вопрос: как лучше всего загружать большие файлы в фоновом режиме, помня обо всех этих моментах?
Я знаю, что уже задано несколько вопросов такого типа, но ни один из них не отвечает на мой вопрос.
Я потратил много времени на реализацию этого, но не могу реализовать его успешно, пожалуйста, помогите мне или дайте какое-нибудь предложение, как лучше всего выполнить вышеуказанные пункты.
Обновлять
Я использую следующий код для создания фрагментов. Код находится в 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;
}
ReleasePool
, но безуспешно. - person Fahad Rehman   schedule 24.04.2017