首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Moya Swift完整示例上传图像多部分

用Moya Swift完整示例上传图像多部分
EN

Stack Overflow用户
提问于 2017-09-12 20:55:54
回答 3查看 5.8K关注 0票数 2

如何使用Moya Swift中的多部分/表单数据上载图像

我的代码

代码语言:javascript
运行
复制
var multipartBody: [MultipartFormData]? {
    switch self {
    case .registerWith(let registrationObject ):
        if let profileImageData = registrationObject.profileImageData{
        return [MultipartFormData(provider: .data(profileImageData), name: "profile_picture", fileName: "\(registrationObject.phone).jpg",
            mimeType: "image/jpeg")]
        }
        return nil
    default:
        return nil
    }
}

var task: Task {
    switch self {
    case .registerWith:
        if let multipartBody = multipartBody {
            return .upload(.multipart(multipartBody))
        }else{
            return .request
        }
    default:
        return .request
    }
}

但是我需要用"profileImage“键将imageData发送到体内

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-08 21:47:09

使用MoyaVersion10.0.0及以上多部分上传图像

1-将要上载到MultipartFormData数组中的文件放到

代码语言:javascript
运行
复制
// put files in MultipartFormData Arry  
   var multipartBody :[Moya.MultipartFormData]?{
    switch self {
    case .registerWith(let imageData , let name ,let description  ):
        // any additional body data or body parms
        let nameDataProvider = MultipartFormData(provider: .data(name.data(using: .utf8)!), name: "name")
        let emailDataProvider = MultipartFormData(provider: .data(email.data(using: .utf8)!), name: "email")
        // image want to upload it or file as a MultipartFormData
        let imageDataProvider = Moya.MultipartFormData(provider: MultipartFormData.FormDataProvider.data(imageData), name: "avatar", fileName: "photo.jpg", mimeType: "image/jpeg")
            return [ imageDataProvider , descriptionDataProvider ]
    default:
        return []
    }
}

这个方法的任务类型是uploadMultipart。

代码语言:javascript
运行
复制
var task: Task {
    switch self {
    case .registerWith:
        // for each method multi part use its multipartBody that declared it in step one needed
        return .uploadMultipart(multipartBody!)
    default:
        guard let parameters = self.parameters else {
            return .requestPlain
        }
        return .requestParameters(parameters: parameters.values, encoding: parameters.encoding)
    }
}

使用MoyaVersion9.0.0及以下多部分上传图像

1-将要上载到MultipartFormData数组中的文件放到

代码语言:javascript
运行
复制
// put files in MultipartFormData Arry  
var multipartBody: [MultipartFormData]? {
     switch self {
          case .registerWith(let imageData , let name ,let description  ):
              return [MultipartFormData(provider: .data(imageData),
             name: "profile_picture", fileName: "fileName", mimeType: "image/jpeg")]
              default:
               return nil
       } 
}

2-添加multipartBody提供程序以请求所需方法的主体

代码语言:javascript
运行
复制
var parameters: [String: Any]? {
     switch self {
          case .registerWith(let registrationObject ):
          var body = registrationObject.toJSON()!
          // add the file in body 
          body["profile_picture"] = multipartBody?[0].provider
          return body
     }
}

3-使此方法的任务类型是上载。

代码语言:javascript
运行
复制
var task: Task {
       switch self {
           case .registerWith:
              //  multipartBody that in First step
             return .upload(.multipart(multipartBody))
        }
}
票数 6
EN

Stack Overflow用户

发布于 2018-02-21 13:04:04

Hear是使用Moya在快速4.2中上传图像的代码

1)在任务中,moya的部分变化类似于下面的函数

代码语言:javascript
运行
复制
var task: Task {
        switch self {

        case .signup(let params):
            var formData = [MultipartFormData]()
            for (key, value) in params {
                if let imgData = value as? Data {
                    formData.append(MultipartFormData(provider: .data(imgData), name: key, fileName: "testImage.jpg", mimeType: "image/jpeg"))
                } else {
                    formData.append(MultipartFormData(provider: .data("\(value)".data(using: .utf8)!), name: key))
                }
            }
            return .uploadMultipart(formData)

        case .signIn(let params), .resetPassword(let params), .changePassword(let params), .socialLogin(let params):
            return .requestParameters(parameters: params, encoding: URLEncoding.default)
        }
    }

2)如何生成参数

代码语言:javascript
运行
复制
        var params = [String:Any]()
        params["first_name"] = self.txtFirstName.text
        params["last_name"] = self.txtLastName.text
        params["email"] = self.txtEmailAddess.text
        params["password"] = self.txtPassword.text

        if self.imgProfilePic.image != nil {
            if let imgData:Data = self.imgProfilePic.image!.pngData() {
                params["picture"] = imgData
            }
        }
        else {
           params["picture"] = ""
        }

并将此参数进一步传递给API调用。

票数 4
EN

Stack Overflow用户

发布于 2017-11-28 12:49:35

您需要将"name:"profile_picture"“改为"name:”profileImage“,尝试以下操作。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46185190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档