ios - 如何使用 Moya Swift 使用多部分请求上传图像?

标签 ios swift multipartform-data moya

我正在使用 Moya 10.0.1,但在尝试将图像上传到服务器时遇到问题。

我确实关注了 Multipart Upload example这是我的设置代码:

typealias UpdateUserAvatarParameters = (userId: Int, image: UIImage)

enum APITarget {
    case updateUserAvatar(parameters: UpdateUserAvatarParameters)
}

extension APITarget: TargetType {

    public var baseURL: URL { return URL(string: "http://domain/api")! }

    public var path: String {
        switch self {
        case .updateUserAvatar: return "/postuserimage"
        }
    }

    public var method: Moya.Method {
        switch self {
        default: return .post
        }
    }

    public var task: Task {
        switch self {
        case .updateUserAvatar(let parameters):
            let imageData = UIImagePNGRepresentation(parameters.image) ?? Data()
            let userIdData = parameters.userId.string.data(using: String.Encoding.utf8) ?? Data()

            let imageMultipartFormData = MultipartFormData(provider: .data(imageData), name: "img", fileName: "user_avatar.jpeg", mimeType: "image/jpeg")
            let userIdMultipartFormData = MultipartFormData(provider: .data(userIdData), name: "cusId")

            return .uploadMultipart([imageMultipartFormData, userIdMultipartFormData])
        }
    }

    public var sampleData: Data {
        return Data()
    }

    public var headers: [String : String]? {
        switch self {
        case .updateUserAvatar: return ["Content-type" : "multipart/form-data"]
        default: return ["Content-type" : "application/json"]
        }
    }
}

但是,当我发出请求时,我得到了一个 MoyaError:

let parameters = UpdateUserAvatarParameters(userId: 1, image: pickedImage)

provider.request(.updateUserAvatar(parameters: parameters), completion: { result in
    switch result {
    case .success(let response):
        do {
            try _ = response.filterSuccessfulStatusCodes()
            print("200 - 299: \(response.data)")
        } catch {
            print(error)  // This code will run because the statusCode is 500
        }

    case .failure(let error):
        print("Failure: \(error)")
    }
})

enter image description here

我不知道我做错了什么,我也不知道statusCode 500是什么?有谁知道为什么吗?

此外,当我使用相同设置(url、参数...)向 Alamofire 发出请求时,一切正常:

Alamofire.upload(multipartFormData: { multipartFormData in
    let imageData = UIImagePNGRepresentation(pickedImage) ?? Data()
    let userIdData = userId.string.data(using: String.Encoding.utf8) ?? Data()

    multipartFormData.append(imageData, withName: "img", fileName: "user_avatar.jpeg", mimeType: "image/jpeg")
    multipartFormData.append(userIdData, withName: "cusId")
}, to: "http://domain/api/postuserimage", encodingCompletion: { result in
    switch result {
    case .success(let upload, _, _):
        upload.uploadProgress(closure: { progress in
            print("Upload Progress: \(progress.fractionCompleted)")
        })

        upload.responseJSON(completionHandler: { response in
            print(response.result.value)
        })

    case .failure(let encodingError):
        print(encodingError)
    }
})

最佳答案

    var task: Task {
    switch self {
    case .updateProfilePic(let memberID, let image):
        let imageData = UIImageJPEGRepresentation(image, 1.0)
        let memberIdData = memberID.data(using: String.Encoding.utf8) ?? Data()
        var formData: [Moya.MultipartFormData] = [Moya.MultipartFormData(provider: .data(imageData!), name: "user_img", fileName: "user.jpeg", mimeType: "image/jpeg")]
        formData.append(Moya.MultipartFormData(provider: .data(memberIdData), name: "member_id"))
        return .uploadMultipart(formData)
    }

在 Moya 多部分请求中,我们必须以多部分数据形式传递参数及其键名。

关于ios - 如何使用 Moya Swift 使用多部分请求上传图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49568660/

相关文章:

ios - RestKit:现在 `postObject mapResponseWith: delegate:` 已弃用,我该用什么?

c++ - Tensorflow:ios 编译错误(重复符号)

iphone - UITableViewCell viewWithTag get frame of UIView 麻烦

ios - 在 Swift 中使用 PFQueryTableViewController(来自解析)

ios - 更快地删除 subview

swift - 如何在 webView :dragSourceActionMaskForPoint:? 中返回 WebDragSourceAction

angularjs - 使用 $http 发送带有 Angular 的多部分/表单数据文件

java - 传递参数以及多部分/表单数据上传表单(Java Http Post Upload)

java - jetty 8多部分/表单数据请求

iphone - 如何将 UIView 隐藏和显示(动画)为 UIActionSheet?