使用Alamofire串行上传多个图像

时间:2016-11-02 11:04:00

标签: ios grand-central-dispatch alamofire image-uploading

我正在开发一个应用程序,其中一个功能是让我们的用户为带有照片的产品提交评论。当我开发图像上传部分时,我遇到了以下问题:

如果用户选择了多张照片,如何通过RESTful API连续上传图像到服务器。我不想让用户同时上传图片。如果其中一张照片上传失败,我不希望以下照片继续上传。也就是说,照片应逐个上传,其中一个失败,然后上传过程将停止,并使用completion调用false回调。如果全部上传,请使用completion。{/ p>致电true

那么我该怎么做才能实现这个目标呢?有什么建议吗?

我使用Xcode 7.3.1 + Swift 2 + Alamofire 3上传图片。 My code来到这里:

import UIKit
import Alamofire


class TestAlamofireMultiUpload: UIViewController {

    var apiUrl: String {
        get {
            return "http://192.168.6.183:8000/api/v1/"  // SD Lib
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let images = [UIImage(named: "test1")!, UIImage(named: "test2")!]
        requestAPIUploadImage("jo21ij3ndooi3okvdani3u43ijfdnk", images: images) { (result) in
            print(result)
        }
    }

    /// Upload file with multipart formdata
    func apiUploadFile(url: String,
                       method: Alamofire.Method,
                       token: String?,
                       multipartFormData: MultipartFormData -> Void,
                       completionHandler: (Response<AnyObject, NSError> -> Void)) {

        let headers = buildHeaders(token)

        Alamofire.upload(method,
                         "\(apiUrl)\(url)/",
                         headers: headers,
                         multipartFormData: multipartFormData,
                         encodingMemoryThreshold: Manager.MultipartFormDataEncodingMemoryThreshold,
                         encodingCompletion: {
                            (encodingResult) in
                            switch encodingResult {
                            case .Success(let request, _, _):
                                request
                                    .validate()
                                    .responseJSON(completionHandler: completionHandler)
                            case .Failure(let err):
                                let error = NSError(domain: "test", code: 1, userInfo: ["message": String(err)])
                                let result: Result<AnyObject, NSError> = .Failure(error)
                                let response = Response(request: nil, response: nil, data: nil, result: result)
                                completionHandler(response)
                            }
        })


    }

    /// Upload image
    func requestAPIUploadImage(token: String, images: [UIImage], completion: ((result: Bool) -> Void)) {

        let parameters = ["imageCategory": "1"]

        ////////////////////////////////////////////////////////////
        /// How can I make the images upload serially here ????? ///
        ////////////////////////////////////////////////////////////
        let image = images[0]

        self.apiUploadFile("image/upload", method: .POST, token: token, multipartFormData: {
            (multipartFormData) in

            // import images to multipart
            if let data = UIImageJPEGRepresentation(image, 1) {
                multipartFormData.appendBodyPart(data: data, name: "imageFile", fileName: "imageFile.jpeg", mimeType: "image/jpeg")
            }

            // import parameters to multipart
            for (key, value) in parameters {
                multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }

            }, completionHandler: {
                (response) in
                switch response.result {
                case .Success(let value):
                    print(value)
                    completion(result: true)
                case .Failure(let error):
                    print(error)
                    completion(result: false)
                }
        })
    }

    private func buildHeaders(token: String?) -> [String: String]? {
        var headers = [String: String]()
        if let token = token {
            headers["Authorization"] = "Token \(token)"
        }
        return headers
    }
}

提前致谢。

0 个答案:

没有答案