2017-05-14 24 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 - Webサーバーに画像をアップロードする

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 
    } 

誰かが私が間違っていることを説明できますか?ありがとう!あなたはこのようなデータを初期化することはできません

答えて

0

Data("foo") 

何ができるかは、次のとおりです。あなたが提供されたリンクのように

Data("foo".utf8) 

。 (あなたは.utf8がありません)

EDIT:はい、その男は彼がそのコードを使いたくないと言ってくれましたが、私の話を聞いてください。このバージョンの拡張機能は、損失のある接続を許可しません。文字列の中に何かを書くと、データは決してゼロにならないでしょう。

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

使用方法:このコードを試してみてください

var body = NSMutableData() 

そしてこの

return body as Data 
+0

こんにちは@Nebojsa、私は最後にutf8を追加しようとしましたが、それでも同じエラーが発生します。他のSO答えの男が 'body.append(文字列:" - \(境界)\ r \ n ")'を使用しないように言いましたので、データを追加していました。 何かをするときのベストプラクティスこのような?私はまだ同じエラーが発生しています。何か案は? – Alan

+0

正確なエラーは何ですか?私はすぐに私の答えを編集します、私は自分のコンピュータ上にこのコードを持っています。 –

+0

あなたの答えに基づいて問題を解決しました。私は拡張子を持つ2番目の方法を使用し、それは魅力のように働いた。ありがとう! – Alan

0

のように返します。

body.appendString("foo") 

ただ、このように体を初期化します。あなたはAPI関数でタスクの前に関数を呼び出す必要があり、上記のコードの後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 
} 

にウェブサーバに画像をアップロードするために、このコードを使用することができます。私は以下のコードに言及しています。

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 
関連する問題