ios - Swift 4 - Alamofire 4 上传带参数的图片

标签 ios swift upload alamofire

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

我需要从 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、参数或 header (请使用 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 的用法感到困惑,或者从这一切的某个地方。所以请有人帮我解决这个问题。

提前致谢。

最佳答案

对于这种情况,您可以使用 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)
        }


    }

关于ios - Swift 4 - Alamofire 4 上传带参数的图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52752706/

相关文章:

Django 应用程序,可以为其他应用程序提供用户友好的、多/批量文件上传功能

javascript - 将文件转换为 url 中的可下载文件 - javascript

iphone - Xcode 中的 NSUserDefault

ios - "Cannot assign value of type ' 无效 ' to type ' PDFAction?为 PDFAnnotation 设置操作时出现 '"错误

ios - Cocos2d-x CCLabelTTF在iPad上不起作用

swift - 场景大小内的节点位置

swift - 游戏场景加载完成后如何显示iAd?

php - FuelPHP 的简单文件上传

ios - 删除按钮没有出现在 UITableViewCell 中

ios - 如何在不使用库swift的情况下反序列化json响应类型