簡體   English   中英

Swift 3 Alamofire分段上傳

[英]Swift 3 Alamofire multipart upload

由於遷移到Swift 3,我發現很難編譯使用Alamofire的項目。

上傳multipartFormData時出現問題:

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

成員'上傳的模糊參考(_: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中實現上傳方法的方法

例如,在Swift 3中使用Alamofire 4.0.0

(確保你已准備好4.0.0,因為你好像尚未更新你的Alamofire)

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)

嘗試這個和url設置為@ pedrouan說。

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

在swift 3中,嘗試將multipartFormData設置為@DCDC在他的解決方案中指出。 XCode嘗試在.data()之前強制轉換為AnyObject,而不是

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

我做到了

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

在我的情況下,我的var列表並不大,所以硬編碼是一個選項。

對於Swift 3和Alamofire~4.3.0

如果像我這樣的人試圖同步獲取請求對象(不使用lock或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中異步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM