2016-09-20 23 views
42

Nhờ di chuyển sang Swift 3, tôi thấy khó biên dịch dự án của tôi sử dụng Alamofire.Swift 3 Alamofire multipart upload

Vấn đề xảy ra khi tải lên multipartFormData:

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

tham khảo mơ hồ thành viên 'upload (_: đến: Phương pháp: tiêu đề :)'

Bất kỳ giúp nhiều đánh giá cao, nhờ vào nâng cao!

QUYẾT:

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) 
      } 

    }) 

này là làm thế nào phương pháp tải lên cần được thực hiện trong 3 Swift

+1

Chữ ký của phương thức đã thay đổi. Bình luận những cái hiện có của bạn và để cho hướng dẫn tự động hoàn thành của Xcode bạn viết những cái mới. – Moritz

+1

và bạn cũng có thể truy cập alamofire trên gitub. https://github.com/Alamofire/Alamofire – Sahil

Trả lời

35

Ví dụ, sử dụng Alamofire 4.0.0 trong Swift 3:

(đảm bảo bạn đã sẵn sàng 4.0.0 vì có vẻ như bạn chưa cập nhật ated Alamofire của bạn chưa)

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

hoặc

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

Vì vậy headers cần phải được thông qua bởi yêu cầu URL:

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

một câu hỏi khác, mã nào sẽ được đặt trong trình giữ chỗ đầu tiên (multipartFormData in) và những gì nên đi theo sau (kết quả là)? Trước đây chỉ có một đóng cửa – DCDC

+0

Không bắt buộc phải điền mã bằng mã, đóng cửa là để bạn sử dụng cuối cùng. Nhưng tôi đoán, việc đóng hoàn thành rất hữu ích khi bạn nhận được phản hồi vì đó là phương pháp không đồng bộ. – pedrouan

+0

Hãy để chúng tôi [tiếp tục cuộc thảo luận này trong trò chuyện] (http://chat.stackoverflow.com/rooms/123785/discussion-between-dcdc-and-pedrouan). – DCDC

6

Hãy thử này và url thiết lập như @pedrouan nói.

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

Nhanh chóng 3, cố gắng đặt multipartFormData như @DCDC được chỉ ra trong giải pháp của mình. XCode cố gắng đúc để AnyObject trước .data(), vì vậy thay vì

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

tôi đã làm

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

Trong trường hợp của tôi var list của tôi là không lớn để hardcoding là một lựa chọn.

0

Đối Swift 3 và Alamofire ~ 4.3.0

Nếu ai đó như tôi đã cố gắng để có được đối tượng yêu cầu đồng bộ (không sử dụng ổ khóa hoặc dispatch_groups), bạn có thể sử dụng phương pháp này:

// 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 

Xin lưu ý rằng bạn cần đặt tiêu đề Content-Type từ bạn multipartFormData vì nó chứa ranh giới.

Nếu bạn không cần phải có đối tượng yêu cầu của bạn đồng bộ các câu trả lời khác với

Alamofire.upload(multipartFormData: { (multipartFormData) in 

đang làm việc như mong đợi. Trong trường hợp mã hóa thành công dữ liệu, nó sẽ trả về đối tượng yêu cầu của bạn khi đóng cửa gọi lại.

LƯU Ý QUAN TRỌNG: nếu bạn sử dụng phương pháp tôi đã mô tả, nó sẽ chặn chuỗi của bạn (trong hầu hết các trường hợp bạn có thể nằm trong chuỗi chính) để sao chép và mã hóa dữ liệu của bạn. Vì vậy, không sử dụng nó cho các tập tin lớn hoặc bất cứ điều gì. Nó là không đồng bộ trong Alamofire với mục đích.

+0

'SessionManager' bắt nguồn từ đâu? – Arbitur

+0

@Arbitur nó là một ví dụ của Alamofire.SessionManager bạn sử dụng để thực hiện một yêu cầu. Trong mã sản xuất của tôi nó được tạo ra một lần khi ứng dụng được khởi tạo và được sử dụng trong suốt ứng dụng. Trong đoạn mã cụ thể này từ câu trả lời, nó có thể được tạo trong mã được đánh dấu là '...' sau hàm // bên ngoài. Mặc dù một lần nữa, nó không liên quan đến nơi bạn đã tạo trình quản lý phiên cho đoạn mã này. – user1264176

Các vấn đề liên quan