iOS Загружать несколько файлов одновременно

Можно ли загрузить два (или более) файла только одним запросом??

Я пытался сделать это с помощью NSMutableURLRequest и NSURLConnection, но пока безуспешно, и я не нашел убедительных ответов в Интернете.

Загрузить один файл легко (используя код из здесь ), но в HTML-спецификациях упоминается, что когда загружая более одного файла, вы должны встроить заголовок multipart/mixed внутри данных multipart/form и файлы, которые будут загружены в этот заголовок multipart/mixed.

Проблема с приведенным выше кодом заключается в том, что в одном загружаемом файле Content-Disposition установлено значение «данные формы» (я думаю, это означает, что один файл является «всеми» данными формы?), что я думаю оставляет «нет места» для прикрепления другого файла. Пожалуйста, поправьте меня, если я ошибаюсь.

Спасибо.


person jere    schedule 02.07.2012    source источник


Ответы (1)


РЕДАКТИРОВАТЬ:

Данные файла, которые вы загружаете, должны быть закодированы с использованием Base64; вы можете сделать это с помощью NSData+Base64, а затем использовать:

[body appendData:[imageData1 base64EncodedString];

для отправки данных файла, при этом я предполагаю, что imageData1 был определен как:

NSData* imageData = UIImagePNGRepresentation(image);

а image это UIImage.

СТАРЫЙ ОТВЕТ:

Это пример из стандарта HTML 4.0.1 (самый конец документа):

Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y

--BbC04y
Content-Disposition: file; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--BbC04y
Content-Disposition: file; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--BbC04y--
--AaB03x--

Обратите внимание, что файлы перечислены все вместе в составном/смешанном списке.

Итак, вы можете попробовать с кодом:

//-- new part in multipart/form-data
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"files\" dataUsingEncoding:NSUTF8StringEncoding]];

//-- new multipart/mixed
[body appendData:[[NSString stringWithFormat:@"multipart/mixed; boundary=%@", mixedBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: file; filename=\"%@\"\r\n", FileParamConstant1] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData1];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];


[body appendData:[[NSString stringWithFormat:@"--%@\r\n", mixedBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: file; filename=\"%@\"\r\n", FileParamConstant2] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData2];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

Позаботьтесь об изменении атрибутов filename и name, и это должно сработать.

person sergio    schedule 02.07.2012
comment
я уже пробовал это, и после проверки запроса с использованием веб-прокси Charles я вижу, что прикрепляется только первый параметр. я пробовал множество разных способов сделать это, и только первый отправленный параметр, похоже, привязывается к запросу. я также не мог найти какой-либо ресурс с подробным описанием того, можно ли это сделать или нет. - person jere; 02.07.2012
comment
спасибо за ваше время, серджио, но я уже пробовал этот код почти так же, как вы его опубликовали. проверив запрос с Чарльзом, я нашел только один параметр файлов (который кажется правильным в соответствии со спецификацией), но внутри него нет файлов. параметр включал часть основного текста запроса, что заставило меня подумать, что где-то была какая-то синтаксическая ошибка, но я ничего не смог найти... может быть, я просто откажусь от этого и отправлю два запроса с nsqueue или GCD - person jere; 02.07.2012
comment
пожалуйста. Вы также проверили, какие данные оставляют вашу машину? body должно поступать на прокси-сервер без изменений (синтаксис не должен иметь никакого значения перед тем, как попасть на веб-сервер)... в конце концов, это просто большая строка, которую вы отправляете... только одно, вы используете Base64 для кодировка содержимого файла? - person sergio; 02.07.2012
comment
я действительно не знаю, но я думаю, что он использует base64... я должен установить это где-то?? Я думал, что [body appendData:imageData]; позаботился обо всем этом кодировании - person jere; 02.07.2012
comment
то это причина, по которой файл прерывает загрузку данных... Я собираюсь отредактировать свой ответ прямо сейчас... - person sergio; 02.07.2012
comment
отличный! проверим это и сообщим вам позже - person jere; 02.07.2012
comment
эй sergio, к сожалению, не повезло... вот вывод заголовков запроса с base64 и с обычной кодировкой (pastebin.com/ HPhRFWzK, pastebin.com/82SAa7vt) в заголовках вроде все ок... i думаю, это просто не поддерживается nsurlrequest или nsurlconnection - person jere; 02.07.2012
comment
Я не думаю, что это зависит от клиентской библиотеки; в конце концов, вы видите, что при использовании base64 все отправляется и принимается правильно... не могли бы вы добавить: Content-Transfer-Encoding: base64 после Content-Type? - person sergio; 02.07.2012
comment
я не мог больше тратить время на эту конкретную проблему, поэтому я отправил два разных запроса, используя GCD ... я все равно отмечу ваш ответ как принятый, спасибо за ваше время! - person jere; 03.07.2012