6

Я пишу веб-приложение и приложение OS X, которое будет загружать файлы на сервер.Отправить файл в кусках с метаданными

Веб-приложение использует FlowJS для обработки отправки файлов на сервер. Наряду с каждым запросом он отправляет номер фрагмента , размер блока, общий размер файла, имя файла, и т. Д. Это здорово, потому что за кулисами я загружаю эти данные в S3, и я использую эту информацию, чтобы определить, когда файл завершает загрузку. Кроме того, поскольку данные поступают в куски, мне не нужно хранить весь файл в памяти на моем сервере.

Для OS X с объективом c, я планирую использовать AFNetworking. Я попытался с помощью многослойных загрузок:

-(void)uploadFileWithUrl:(NSURL*)filePath { 
    AFHTTPRequestOperationManager*manager = [AFHTTPRequestOperationManager manager]; 
    [manager POST:@"http://www.example.com/files/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFileURL:filePath name:@"blob" error:nil]; 
    } success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Success: %@", responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
} 

, но это просто пытается отправить весь файл в одном запросе, который не является приемлемым, поскольку сервер будет работать из памяти на больших запросах.

Что бы я хотел знать, если есть что-то вроде FlowJS для объектива C, или если есть какой-то способ включить эту информацию в AFNetworking для каждого вызова.

+1

Вы видели это: https://github.com/AFNetworking/AFNetworking/issues/1398? Похоже, вы могли бы использовать 'uploadTaskWithRequest: fromFile: progress: completeHandler:' – jacobhyphenated

+0

@jacobhyphenated Это не добавляет прогресса в запрос, хотя это делает? – eliot

ответ

-1

Не думаю, что вы можете сделать это автоматически очень легко. (И если кто-то знает, как это сделать, я хотел бы знать ответ.)

Multipart не помогает, потому что он структурирует контент, но не передает. Подумайте об этом как о параграфах в текстовом документе: они придают тексту структуру, но это еще один файл.

Это приводит к реальной проблеме: вы хотите иметь куски фиксированного размера и отправлять кусок после обработки (загружается на S3), затем следующий кусок и так далее. Как клиент знает, что первый кусок обрабатывается? HTTP не работает так, как вы можете отправлять новые данные, когда первый получил сервер. Вы отправляете следующий фрагмент, когда первый отправляется (по пути). Я не уверен, гарантирует ли AFNetworking запрос на следующую часть после отправки первой части ... Может быть, она хочет собрать мелкие детали.

Почему бы вам не сделать это, S3 делает:

Инициировать запрос на загрузку с идентификатором в качестве ответа. Затем отправьте кусок, используя этот идентификатор загрузки. Если это будет сделано, сервер ответит, и следующая часть будет отправлена. У вас есть рукопожатие.

+0

Не могли бы вы объяснить, как AWS делает это немного подробнее? По моему мнению, вы загружаете кусок на S3, отправляя идентификатор с запросом. Как только AWS получает это, он отвечает тем же идентификатором, уведомляя вас о том, что он успешно получил кусок. Учитывая этот идентификатор, клиент должен знать, какой кусок отправить дальше. Затем, после завершения, клиент отправляет специальный запрос, уведомляющий AWS, что запрос завершен. Это верно? – eliot

+0

думаю. Но вы уже используете AWS ?! –

+0

У вас есть «успех» и «блоки отказов». Вы можете разделить файл на куски и отправить их в цепочку (чтобы упростить передачу файлов). Единственная проблема заключается в том, как работать с кусками данных на сервере. –

Смежные вопросы