2017-05-14 54 views
1

我想上傳從選擇的UIImagePickerController託管於AWS我的Web服務器的圖像。我正在學習本教程:https://www.udemy.com/swift-php-mysql-user-sign-up-sign-in-sign-out-and-more/learn/v4/overview,我收到了一堆Argument labels '(_:)' do not match any available overloads錯誤。我試着搜索這個錯誤,但我沒有發現任何與我目前的代碼有關的東西。我沒有使用教程中的原始代碼,我試圖將其翻譯爲Swift3並使用以下答案:iOS swift NSMutableData has no member appendString以遵循最佳編碼實踐。這是我現在的代碼:swift3 - 上傳圖像的網絡服務器

func createBodyWithParameters(_ parameters: [String: String]?, filePathKey: String?, imageDataKey: Data, boundary: String) -> Data { 
     var body = Data(); 

     if parameters != nil { 
      for (key, value) in parameters! { 
       body.append(Data("--\(boundary)\r\n")) 
       body.append(Data("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")) 
       body.append(Data("\(value)\r\n")) 
      } 
     } 

     let filename = "user-profile.jpg" 

     let mimetype = "image/jpg" 

     body.append(Data("--\(boundary)\r\n")) 
     body.append(Data("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")) 
     body.append(Data("Content-Type: \(mimetype)\r\n\r\n")) 
     body.append(imageDataKey) 
     body.append(Data("\r\n")) 



     body.append(Data("--\(boundary)--\r\n")) 

     return body as Data 
    } 

有人可以解釋我在做什麼錯嗎?謝謝!在你提供的鏈接

Data("foo".utf8) 

像:

回答

0

你不能這樣初始化數據:

Data("foo") 

你可以做的是。 (你錯過.utf8)

編輯:是的,這傢伙說他不想使用該代碼,但聽到我說,這個版本的擴展不允許有損連接,只要你在字符串內寫入任何內容,數據永遠不會爲零。

extension NSMutableData { 
    func appendString(_ string: String) { 
     let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false) 
     append(data!) 
    } 
} 

用法:

body.appendString("foo") 

只是初始化體是這樣的:

var body = NSMutableData() 

,並返回這樣

return body as Data 
+0

嗨@Nebojsa,我試着在最後添加utf8,但它仍然給出了同樣的錯誤。我加入的數據,因爲在其他的傢伙,所以答覆中提到,你不應該使用'body.append(字符串:「 - \(邊界)\ r \ n」)' 做的事情時,什麼是最好的做法喜歡這個?儘管如此,我仍然遇到同樣的錯誤。有任何想法嗎? – Alan

+0

你得到了什麼確切的錯誤?我很快會編輯我的答案,我的電腦上有這個代碼。 –

+0

根據你的回答解決了這個問題。我用擴展的第二種方法,它的工作就像一個魅力。謝謝! – Alan

0

試試這個代碼。您可以在swift3

func generateBoundaryString() -> String 
{ 
    return "Boundary-\(NSUUID().uuidString)" 
} 

func photoDataToFormData(parameters: [String: String]?, data: Data, boundary:String, fileName:String) -> Data 
{ 
    var fullData = Data() 

    if parameters != nil { 
     for (key, value) in parameters! { 

      print ("Key: \(key), Value: \(value)") 
      let str = "--\(boundary)\r\n" + "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n" + "\(value)\r\n" 
      let data = str.data(using: String.Encoding.utf8, allowLossyConversion: true) 

      fullData.append(data!) 
     } 
    } 

    // 1 - Boundary should start with -- 
    let lineOne = "--" + boundary + "\r\n" 
    fullData.append(lineOne.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 2 
    let lineTwo = "Content-Disposition: form-data; name=\"image\"; filename=\"" + fileName + "\"\r\n" 
    NSLog(lineTwo) 
    fullData.append(lineTwo.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 3 
    let lineThree = "Content-Type: image/jpg\r\n\r\n" 
    fullData.append(lineThree.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 4 
    fullData.append(data) 

    // 5 
    let lineFive = "\r\n" 
    fullData.append(lineFive.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 

    // 6 - The end. Notice -- at the start and at the end 
    let lineSix = "--" + boundary + "--\r\n" 
    fullData.append(lineSix.data(using: String.Encoding.utf8, allowLossyConversion: false)!) 
    return fullData 
} 

使用此代碼上傳圖像的網絡服務器,你需要在API函數任務之前調用函數上面的代碼之後。我已經提到了下面的代碼。

let imageData = UIImageJPEGRepresentation(profileImage.image!, 0.5) 

let boundary = generateBoundaryString() 

let fullData = photoDataToFormData(parameters: parameters as? [String : 
String], data: imageData!, boundary: boundary, fileName: "Test.jpg") 

request.setValue("multipart/form-data; boundary=" + boundary, 
forHTTPHeaderField: "Content-Type") 

    // REQUIRED! 
request.setValue(String(fullData.count), forHTTPHeaderField: "Content- 
Length") 

request.httpBody = fullData