我正在开发一个应用程序,其中一个功能是让我们的用户为带有照片的产品提交评论。当我开发图像上传部分时,我遇到了以下问题:
如果用户选择了多张照片,如何通过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
}
}
提前致谢。