如何在Swift中使用Codable和URLSession.shared.uploadTask(multipart / form-data)上传图像文件

问题描述 投票:0回答:1

我想使用某些URL端点将图像文件上传到后端服务器。我可以使用Alamofire的上载请求作为multipartFormData轻松地做到这一点。但是,我想摆脱Alamofire,以最大程度地减少对第三方框架的依赖。这是有效的Alamofire代码:

func uploadRequestAlamofire(parameters: [String: Any], imageData: Data?, completion: @escaping(CustomError?) -> Void ) {

let url = imageUploadEndpoint!

let headers: HTTPHeaders = ["X-User-Agent": "ios",
                            "Accept-Language": "en",
                            "Accept": "application/json",
                            "Content-type": "multipart/form-data",
                            "ApiKey": KeychainService.getString(by: KeychainKey.apiKey) ?? ""]

Alamofire.upload(multipartFormData: { (multipartFormData) in
    for (key, value) in parameters {
        multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
    }

    if let data = imageData {
        multipartFormData.append(data, withName: "file", fileName: "image.png", mimeType: "image/jpg")
    }

}, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
    switch result {
    case .success(let upload, _, _):
        upload.responseJSON { response in

            completion(CustomError(errorCode: response.response!.statusCode))

            print("Succesfully uploaded")
        }
    case .failure(let error):
        print("Error in upload: \(error.localizedDescription)")

    }
}
}

这里是URLSession上传任务,该任务不起作用:

func requestNativeImageUpload(imageData: Data, orderExtId: String) {

var request = URLRequest(url: imageUploadEndpoint!)
request.httpMethod = "POST"
request.timeoutInterval = 10

    request.allHTTPHeaderFields = [
        "X-User-Agent": "ios",
        "Accept-Language": "en",
        "Accept": "application/json",
        "Content-type": "multipart/form-data",
        "ApiKey": KeychainService.getString(by: KeychainKey.apiKey) ?? ""
    ]

let body = OrderUpload(order_ext_id: orderExtId, file: imageData)

do {
    request.httpBody = try encoder.encode(body)
} catch let error {
    print(error.localizedDescription)
}

let session = URLSession.shared



session.uploadTask(with: request, from: imageData)  { data, response, error in
    guard let response = response as? HTTPURLResponse else { return }

    print(response)
    if error != nil {
        print(error!.localizedDescription)
    }


    }.resume()
}

这是我为Alamofire和URLSession调用方法的方式:

uploadRequestAlamofire(parameters: ["order_ext_id": order_ext_id, "file": "image.jpg"], imageData: uploadImage) { [weak self] response in } 

requestNativeImageUpload(imageData: uploadImage!, orderExtId: order_ext_id)

这是后端服务器希望在请求正文中收到的内容:

let order_ext_id: String
let description: String
let file: string($binary)

这是为请求的httpBody编码的Codable结构。

struct OrderUpload: Codable {
    let order_ext_id: String
    let description: String 
    let file: String
}

尽管在此演示中,我的方法可能不完全合适,并且我不处理响应状态代码,但是Alamofire方法效果很好。

为什么URLSession不起作用?

ios swift alamofire multipartform-data codable
1个回答
0
投票

控制台中有什么,是否存在某种错误消息?一见钟情对我来说很好。

© www.soinside.com 2019 - 2024. All rights reserved.