2012-07-02 50 views
0

是否可以在一個請求中上傳兩個(或多個)文件?iOS一次上傳多個文件

我一直在努力做到這一點與NSMutableURLRequest和NSURLConnection,但迄今沒有成功,我發現沒有令人信服的答案在線。

可以很容易地上傳一個文件(使用代碼here),但HTML Specs提到,上傳多個文件時,你必須嵌入的multipart/form-data的內部多/混合頭,並且這些文件是上傳到多部分/混合標題中。

上面鏈接的代碼存在的問題是,正在上傳的一個文件將Content-Disposition設置爲「form-data」(我猜這意味着單個文件是表單數據的「全部」? ),我認爲它留下「沒有空間」來附加另一個文件。如果我錯了,請糾正我。

謝謝。

回答

2

編輯:

您正在上傳的文件數據應使用Base64進行編碼;您可以通過NSData+Base64手段做到這一點,然後使用:

[body appendData:[imageData1 base64EncodedString]; 

要發送的文件數據,因此我認爲imageData1被定義爲:

NSData* imageData = UIImagePNGRepresentation(image); 

imageUIImage

OLD解答:

這是從HTML 4.0.1 standard未來的例子(非常文檔的結束):

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]]; 

保重改變filenamename屬性,它應該工作。

+1

我已經嘗試過,並使用查爾斯網絡代理檢查請求後,我看到只有第一個參數被連接。我嘗試了很多不同的方式來做到這一點,只有發送的第一個參數似乎附加到請求。我也找不到任何資源詳細說明這是否可以完成。 – jere

+0

請看,我的編輯... – sergio

+0

感謝您的時間塞爾吉奧,但我已經嘗試過的代碼幾乎完全一樣,因爲你張貼它。用查爾斯檢查請求我發現只有一個「文件」參數(根據規範,這似乎是正確的),但裏面沒有文件。該參數包含了一些請求的正文文本,導致我認爲某處出現了一些語法錯誤,但我找不到任何東西......也許我會放棄它,併發送兩個請求,一個nsqueue或GCD – jere

相關問題