2017-05-14 42 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 
相关问题