web-dev-qa-db-ja.com

Swift 3 Alamofireマルチパートアップロード

Swift 3への移行のおかげで、Alamofireを使用するプロジェクトをコンパイルするのが難しいことがわかりました。

MultipartFormDataをアップロードするときに問題が発生します。

Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
        multipartFormData in
.
.
. 
}) 

メンバー 'upload(_:to:method:headers :)'へのあいまいな参照

助けていただければ幸いです、事前に感謝します!

解決済み:

 Alamofire.upload(multipartFormData: { (multipartFormData) in

        multipartFormData.append(fileData, withName: "file_pack", fileName: "file_pack", mimeType: "text/plain")


        for (key, value) in self.parameters {
            multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
        }
        }, with: URL2, encodingCompletion: { (result) in

            switch result {
            case .success(let upload, _, _):

                upload.responseJSON { response in
                    self.delegate?.showSuccessAlert()
                    print(response.request)  // original URL request
                    print(response.response) // URL response
                    print(response.data)     // server data
                    print(response.result)   // result of response serialization
                    //                        self.showSuccesAlert()
                    self.removeImage("frame", fileExtension: "txt")
                    if let JSON = response.result.value {
                        print("JSON: \(JSON)")
                    }
                }

            case .failure(let encodingError):
                self.delegate?.showFailAlert()
                print(encodingError)
            }

    })

これが、Swift 3でのアップロード方法の実装方法です。

45
DCDC

たとえば、Alamofire 4.0.0 in Swiftを使用:

(Alamofireをまだ更新していないように見えるため、4.0.0の準備ができていることを確認してください)

Alamofire.upload(multipartFormData: { (multipartFormData) in
        // code
    }, to: URL, encodingCompletion: { (result) in
        // code
    })

または

Alamofire.upload(multipartFormData: { (multipartFormData) in
        // code
    }, with: URL, encodingCompletion: { (result) in
        // code
    })

したがって、headersはURLリクエストで渡す必要があります。

let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
36
pedrouan

これを試して、URLを@ pedrouan に設定してください。

Alamofire.upload(multipartFormData: { (multipartFormData) in
       multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
}, to: url) 
{ (result) in
      //result
}
7
Mitul Marsoniya

Swift 3およびAlamofire〜4.3.0の場合

私のような誰かが(ロックやdispatch_groupsを使用せずに)同期してリクエストオブジェクトを取得しようとした場合、このアプローチを使用できます。

// outer function
...
let string = "string to send"
let multipartFormData = MultipartFormData()
multipartFormData.append(string.data(using: .utf8)!, withName: "str")

guard let data = try? multipartFormData.encode() else {
    // fail appropriately
}

let request = sessionManager.upload(data,
                                    to: url,
                                    method: .post,
/* this is VERY IMPORTANT LINE */   headers: ["Content-Type" : multipartFormData.contentType])

request.validate()
// do whatever you need with request

multipartFormDataには境界が含まれているため、Content-Typeヘッダーを設定する必要があることに注意してください。

リクエストオブジェクトを同期的に取得する必要がない場合は、

Alamofire.upload(multipartFormData: { (multipartFormData) in

期待どおりに動作しています。データのエンコードが成功した場合、コールバッククロージャでリクエストオブジェクトを返します。

重要な注意:私が説明した方法を使用すると、データをコピーおよびエンコードするためにスレッドをブロックします(ほとんどの場合、おそらくメインスレッドにいます)。したがって、大きなファイルなどには使用しないでください。 Alamofireでは意図的に非同期です。

1
user1264176

Swift 3では、彼のソリューションで指摘した@DCDCとしてmultipartFormDataを設定しようとしました。 XCodeは.data()の前にAnyObjectにキャストしようとするため、

value.data(using: String.Encoding.utf8)!, withName: key

やった

[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key

私の場合、varリストは大きくなかったので、ハードコーディングがオプションでした。

1