2015-05-12 206 views
3

我正在向服務器發出多部分POST請求,一切正常,但我上傳的jpeg沒有文件擴展名,無法打開(文件大小與原始相同)。我已經在不同的服務器上嘗試了這一點,並且發生了相同的錯誤,所以我假設它是我的應用程序代碼的問題。ios多部分圖片上傳,上傳文件損壞

let boundary = generateBoundaryString() 
    let request = NSMutableURLRequest(URL: Urls.sendFileURL) 
    request.HTTPMethod = "POST" 
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 

    let body = NSMutableData() 

    for (key, value) in params { 
     body.appendString("--\(boundary)\r\n") 
     body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
     body.appendString("\(value)\r\n") 
    } 


    let imageData: NSData = UIImageJPEGRepresentation(photo, 0.8) 

    body.appendString("--\(boundary)\r\n") 
    body.appendString("Content-Disposition: form-data; name=\"iosUpload\"; filename=\"iosUpload.jpg\"\r\n\r\n") 
    body.appendString("Content-Type: image/jpeg\r\n\r\n") 
    body.appendData(imageData) 
    body.appendString("\r\n") 
    body.appendString("--\(boundary)\r\n") 

    request.HTTPBody = body 

我使用posttestserver.com this is the result

回答

0

想我的文章中,我不熟悉的IOS,但是你無法找到一個圖書館構建一個多要求,你必須推出自己的?

我至少可以發現以下問題:

1)

body.appendString("Content-Disposition: form-data; name=\"iosUpload\"; filename=\"iosUpload.jpg\"\r\n\r\n") 

這裏有一個額外的\r\n。它應該是

body.appendString("Content-Disposition: form-data; name=\"iosUpload\"; filename=\"iosUpload.jpg\"\r\n") 

2)

body.appendString("--\(boundary)\r\n") 

缺少結束--這裏。它應該是

body.appendString("--\(boundary)--\r\n") 
+0

感謝您的投入,我已經試過這一點,但是這不會改變任何東西。 – Leszek

1

我有一個類似的問題:我上傳使用multipart/form-data一個JPEG,當我重新下載從它不能被Preview.app打開服務器相同的文件,也不能使用創建一個UIImage的實例,因爲它已損壞。

enter image description here

我打開這兩個文件並排側FileMerge.app(包含在Xcode.app/Contents/Applications/),令我驚訝的是,已損壞的文件有一個額外的空行(CRLF ) 在頂部; 否則,它們是相同的

顯然,我插入一個額外的\r\n只是之前我在我的文件的內容附加到上傳請求的身體。

我改變了我的上傳代碼從這個:

let body = NSMutableData() 

body.appendString("--\(boundary)\r\n") 
body.appendString("Content-Disposition: form-data; name=\"inputFile\"; filename=\"\(fileName)\"\r\n") 
body.appendString("Content-Type: image/jpeg\r\n\r\n\r\n") // !!!! THREE CRLF 
body.appendData(fileData)  
body.appendString("\r\n--\(boundary)--") 

...這樣的:

let body = NSMutableData() 

body.appendString("--\(boundary)\r\n") 
body.appendString("Content-Disposition: form-data; name=\"inputFile\"; filename=\"\(fileName)\"\r\n") 
body.appendString("Content-Type: image/jpeg\r\n\r\n") // !!!! TWO CRLF 
body.appendData(fileData)  
body.appendString("\r\n--\(boundary)--") 

...現在下載的文件是有效的JPEG,等同於一個我上傳。

所以我建議你並排打開你的文件的兩個版本,看看有什麼變化。

(FileMerge會抱怨「文件不是ASCII。」,只是忽略它,然後繼續。)