首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Alamofire 5中上传文件和传递参数数据

如何在Alamofire 5中上传文件和传递参数数据
EN

Stack Overflow用户
提问于 2020-01-27 00:38:16
回答 2查看 1.1K关注 0票数 2

如何在Alamofire 5中上传文件和传递参数数据

我需要一个解决这个问题的解决方案,我想把一张图片上传到服务器上,里面有参数中的数据。

这是邮递员的要求

这是我的解决办法:

代码语言:javascript
运行
复制
func createPhoto(name : String , email : String,gender:String,region:String,bod:String,activity_name:String,organisation_name:String,photo: UIImage, completion: @escaping (_ error: Error?, _ success: Bool)->Void) {

    var Token : String?
    var  tasksMO = [NSManagedObject]()
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ConfirmActivationEntity")
    do {
        let results = try pe.context.fetch(request)
        tasksMO = results as! [NSManagedObject]
        for taskmo in tasksMO {
            Token = (taskmo.value(forKey: "access_token")  as! String )
        }
        print("assbil")
    } catch {
        print("fild")
    }
    print(" Token :\(Token!)")

    let headers : HTTPHeaders = ["Authorization":"Bearer \(Token!)","X-HTTP-Method-Override":"PUT","Accept-Language" : Locale.current.languageCode ?? "ar", "Content-Type" : "application/x-www-form-urlencoded","Accept" : "application/json"]


    let parameters : Parameters = ["name" : name,"region":region,"activity_id":ActivityCode!,"organization_id":OrganizationCode!,"gender":gender,"job_id":JobCode!,"interest_id":IntrestedCode!,"organisation_name":organisation_name,"activity_name":activity_name,"bod":bod,"city":region,"email":email,"profile_pic":photo]

    guard let url = URL(string: "\(UrlApi.url)\(UrlApi.crateUser)") else { return }


    Alamofire.upload(multipartFormData: { (form: MultipartFormData) in

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

        //                if let data = imagedata{
        //                    multipartFormData.append(data, withName: "imagename", fileName: "imagename.jpg", mimeType: "image/jpeg")
        //                }

        if let data = photo.jpegData(compressionQuality: 0.5) {
            form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
        }

    }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url,method: .post, headers: headers) { (result: SessionManager.MultipartFormDataEncodingResult) in

        switch result {
        case .failure(let error):
            print(error)
            completion(error, false)

        case .success(request: let upload, streamingFromDisk: _, streamFileURL: _):

            upload.uploadProgress(closure: { (progress: Progress) in
                print(progress)
            })
                .responseJSON(completionHandler: { (response: DataResponse<Any>) in

                    switch response.result
                    {
                    case .failure(let error):
                        print(error)
                        completion(error, false)

                    case .success(let value):
                        let json = JSON(value)
                        print(json)

                        if let status = json["status"].toInt, status == 1 {
                            // success
                            print("Upload Succeed")
                            completion(nil, true)
                        } else {
                            print("Upload Failed")
                            completion(nil, false)
                        }
                    }

                })
        }

    }

}

这一反应来自于发球:

代码语言:javascript
运行
复制
responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))

我使用的是阿拉莫火吊舱和SwiftyJson吊舱,iOS 13、with 5和Xcode 11。

请帮助我:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-27 05:22:21

您应该在MultipartFormData中传递图像数据,而不是与parameter字典中的其他参数一起传递。

只需像下面这样更改您的代码,并检查它是否工作。

代码语言:javascript
运行
复制
//Remove profile pic param from parameters.
let parameters : Parameters = ["name" : name,"region":region,"activity_id":ActivityCode!,"organization_id":OrganizationCode!,"gender":gender,"job_id":JobCode!,"interest_id":IntrestedCode!,"organisation_name":organisation_name,"activity_name":activity_name,"bod":bod,"city":region,"email":email]

guard let url = URL(string: "\(UrlApi.url)\(UrlApi.crateUser)") else { return }

Alamofire.upload(multipartFormData: { (form: MultipartFormData) in

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

          if let data = photo.jpegData(compressionQuality: 0.5) {
               form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
          }
 }
票数 1
EN

Stack Overflow用户

发布于 2020-01-27 04:55:10

不要在参数字典中包含图像。或在添加到MultipartFormData时跳过此操作,如下所示

代码语言:javascript
运行
复制
Alamofire.upload(multipartFormData: { form in
    for (key, value) in parameters {
        if !(value is UIImage), let data = "\(value)".data(using: .utf8) {
            form.append(data, withName: key as String)
        }
    }
    if let data = photo.jpegData(compressionQuality: 0.5) {
        form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59924081

复制
相关文章

相似问题

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