【问题标题】:Swift 4 - Alamofire 4 Upload Image with ParameterSwift 4 - Alamofire 4 上传带参数的图片
【发布时间】:2019-03-16 02:26:48
【问题描述】:

我知道有很多关于此的教程或问题。我已经尝试了所有方法,但我没有运气。

我需要从Alamofire 获取上传进度。这是我的代码:

func uploadpp(data1: Array<Any>, data2: Data?){
    guard let url = URL(string: "\(API.storage)/upload/profile/picture?format=json") else {
        return
    }

    let parameters: Parameters = [
        "crop": [],
        "folder_type": "1",
        "folderid": "0",
        "image_byte": data1,
        "image_url": "",
        "partnerid": "\(memberid)",
        "partneruserid": "0",
        "publicip": "",
        "sourceid": "4"
    ]

    let headers: HTTPHeaders = [
        "Authorization": API.basicstring,
        "Content-type": "multipart/form-data"
    ]

    Alamofire.upload(multipartFormData: { (multipartFormData) in
        if let data = data2 {
            multipartFormData.append(data, withName: "image", fileName: "image.jpeg", mimeType: "image/jpeg")
        }

        for (key, value) in parameters {
            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key)
        }
    }, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
        switch result {
        case .success(let upload, _, _):
            upload.uploadProgress(closure: { (progress) in
                print("proses", progress.fractionCompleted)
            })

            upload.responseJSON { response in
                print("Succesfully uploaded")
                if let err = response.error {
                    print("upload:", err)
                    return
                }

                if let s = response.result.value {
                    print("result:", s)
                    return
                }
            }
        case .failure(let error):
            print("Error in upload: \(error.localizedDescription)")
        }
    }
}

data1 是图像的字节数组。我需要这个,因为我的 API 必须读取这种类型。而data2UIImageJPEGRepresentation(img, 0.5) 的结果。

然后当我尝试这个时,它打印了Successfully uploaded,但随后给了我错误:

responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 3." UserInfo={NSDebugDescription=Invalid value around character 3.}))

据我所知,当您在 url、参数或标题上出错时会出现此错误(请使用 CMIIW)。

但我已尝试将其发送给 Alamofire.request,所以这是我的另一个代码:

func uploadpp(data: Array<Any>){
    guard let url = URL(string: "\(API.storage)/upload/profile/picture?format=json") else {
        return
    }

    let parameters: Parameters = [
        "crop": [],
        "folder_type": "1",
        "folderid": "0",
        "image_byte": data,
        "image_url": "",
        "partnerid": "\(memberid)",
        "partneruserid": "0",
        "publicip": "",
        "sourceid": "4"
    ]

    let headers: HTTPHeaders = [
        "Authorization": API.basicstring,
        "Accept": "application/json"
    ]

    let req = Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
    req.downloadProgress { progress in
        print("lalala", Float(req.progress.fractionCompleted), progress.completedUnitCount)
    }

    req.responseJSON { response in
        if response.result.isSuccess {
            _ = self.getdata(json: JSON(response.result.value!))
            print(response.result.value!)
        }
        else {
            print("upload:", response.result.error!)
        }
    }
}

这是成功的,但没有给我进展。它只是给出了“1.0”。

也许我对Alamofire.requestAlamofire.upload 的使用感到困惑,或者这一切。所以请有人帮我解决这个问题。

提前致谢。

【问题讨论】:

  • 尝试将编码改为 URLEncoding.httpBody
  • 您的回复似乎不是正确的 json 格式!确保您收到 json 格式的响应。
  • @iVarun 我会试试的。谢谢
  • @Lion 没有。我很确定它们是 json 格式
  • @cathrinnatalia URLEncoding.httpBody 适合你吗?

标签: ios swift upload alamofire


【解决方案1】:

你可以使用MultipartFormData来解决这个问题,试试这个

let parameters = [
            "station_id" :        "1000",
            "title":      "Murat Akdeniz",
            "body":        "xxxxxx"]

let imgData = UIImageJPEGRepresentation(UIImage(named: "1.png")!,1)



    Alamofire.upload(
        multipartFormData: { MultipartFormData in
        //    multipartFormData.append(imageData, withName: "user", fileName: "user.jpg", mimeType: "image/jpeg")

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

        MultipartFormData.append(UIImageJPEGRepresentation(UIImage(named: "1.png")!, 1)!, withName: "photos[1]", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
        MultipartFormData.append(UIImageJPEGRepresentation(UIImage(named: "1.png")!, 1)!, withName: "photos[2]", fileName: "swift_file.jpeg", mimeType: "image/jpeg")


    }, to: "http://url") { (result) in

        switch result {
        case .success(let upload, _, _):

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

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


    }

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2017-04-22
    • 2017-02-10
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多