繁体   English   中英

如何在iOS,Swift3,Alamofire 4中使用多部分表单数据将图像作为参数上传以及其他参数

[英]How to upload image as a parameter, with other parameters using multipart form data in ios, swift3, Alamofire 4

我正在使用Alamofire 4 with swift 3更新用户个人资料。 而且我正在使用Router类。 我需要的是使用其他参数进行uplaod和图像处理。 我可以update用户详细信息,而无需上传图像部分。

这就是postman样子

在此处输入图片说明

所以有可能为此创建一个urlconvertible请求。 如何上传带有其他参数的图像。 (这在邮递员中很好用)。 我该如何使用新的Alamofire做到这Alamofire 我尝试如下。

let parameters = [
            "profile_image": "swift_file.jpeg"
        ]


        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")
            for (key, value) in parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to:urltoUpdate)
        { (result) in
            switch result {
            case .success(let upload, _, _):
                print("the status code is :")

                upload.uploadProgress(closure: { (progress) in
                    print("something")
                })

                upload.responseJSON { response in
                    print("the resopnse code is : \(response.response?.statusCode)")
                    print("the response is : \(response)")
                }
              break
            case .failure(let encodingError):
                print("the error is  : \(encodingError.localizedDescription)")
                break
            }
        }

但这不能正常工作。 希望您对此部分有所帮助。

您不需要这个:

"profile_image": "swift_file.jpeg"

并且参数应为:

let parameters = [
    "firstname": "Bill",
    "surname": "fox",
    //...rest of the parameters
]

而这withName: "file"

multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")

应该是withName: "profile_image"

multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")

带标题的代码:

let parameters = [
    "firstname": "Bill",
    "surname": "fox",
    //...rest of the parameters
]

let headers = [
    "somekey": "somevalue",
    //...rest of the parameters
]

Alamofire.upload(multipartFormData: { (multipartFormData) in

    multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")

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

}, usingThreshold:UInt64.init(),
   to: "", //URL Here
   method: .post,
   headers: headers, //pass header dictionary here
   encodingCompletion: { (result) in

    switch result {
    case .success(let upload, _, _):
        print("the status code is :")

        upload.uploadProgress(closure: { (progress) in
            print("something")
        })

        upload.responseJSON { response in
            print("the resopnse code is : \(response.response?.statusCode)")
            print("the response is : \(response)")
        }
        break
    case .failure(let encodingError):
        print("the error is  : \(encodingError.localizedDescription)")
        break
    }
})

只需将此方法放入NSObjecte File中即可。

进口Alamofire`

class func postImageToUrl(_ serverlink:String,methodname:String,param:NSDictionary,image:UIImage!,withImageName : String,CompletionHandler:@escaping (Bool,NSDictionary) -> ()) {



        print("POST : " + serverlink + methodname + " and Param \(param) ")

        var fullLink = serverlink

        if fullLink.characters.count > 0 {

            fullLink = serverlink + "/" + methodname
        }
        else {

            fullLink = methodname
        }

        var imgData = Data()
        if image != nil {

            imgData = UIImageJPEGRepresentation(image!, 1.0)!
        }

        let notallowchar : CharacterSet = CharacterSet(charactersIn: "01234").inverted
        let dateStr:String = "\(Date())"
        let resultStr:String = (dateStr.components(separatedBy: notallowchar) as NSArray).componentsJoined(by: "")
        let imagefilename = resultStr + ".jpg"

        Alamofire.upload(multipartFormData:{ multipartFormData in
            multipartFormData.append(imgData, withName: withImageName as String, fileName: imagefilename, mimeType: "image/jpeg")

            for (key, value) in param {

                //let data = (value as! String).data(using: String.Encoding.utf8)!
                let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue)
                multipartFormData.append(data!, withName: key as! String)

            }
        },
        usingThreshold:UInt64.init(),
        to:fullLink,
        method:.post,
        headers:[:],
        encodingCompletion: { encodingResult in

            switch encodingResult {

                case .success(let upload, _, _):

                upload.uploadProgress { progress in // main queue by default

                    print("Upload Progress: \(progress.fractionCompleted)")
                }

                upload.responseJSON { response in

                    print(response)


                    if let TempresponseDict:NSDictionary = response.result.value as? NSDictionary {

                        if (TempresponseDict.object(forKey: "response") as? String)?.caseInsensitiveCompare("success") == .orderedSame {

                            CompletionHandler(true, TempresponseDict)
                        }
                        else {

                            var statusCode = response.response?.statusCode

                            if let error = response.result.error as? AFError {

                                statusCode = error._code // statusCode private

                                switch error {

                                case .invalidURL(let url):
                                    print("Invalid URL: \(url) - \(error.localizedDescription)")
                                case .parameterEncodingFailed(let reason):
                                    print("Parameter encoding failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")
                                case .multipartEncodingFailed(let reason):
                                    print("Multipart encoding failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")
                                case .responseValidationFailed(let reason):
                                    print("Response validation failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")

                                    switch reason {

                                    case .dataFileNil, .dataFileReadFailed:
                                        print("Downloaded file could not be read")
                                    case .missingContentType(let acceptableContentTypes):
                                        print("Content Type Missing: \(acceptableContentTypes)")
                                    case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
                                        print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
                                    case .unacceptableStatusCode(let code):
                                        print("Response status code was unacceptable: \(code)")
                                        statusCode = code
                                    }
                                case .responseSerializationFailed(let reason):

                                    print("Response serialization failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")
                                    // statusCode = 3840 ???? maybe..
                                }

                                print("Underlying error: \(error.underlyingError)")
                            }
                            else if let error = response.result.error as? URLError {

                                print("URLError occurred: \(error)")
                            }
                            else {

                                print("Unknown error: \(response.result.error)")
                            }

                            print("\(statusCode)") // the status code


                            CompletionHandler(false, TempresponseDict)
                        }
                    }
                    else {

                        CompletionHandler(false, NSDictionary())
                    }
                }

                case .failure(let encodingError):

                    print(encodingError)

                    CompletionHandler(false, NSDictionary())
            }
        })

}

2.使用

yourNSObjectClassName.postImageToUrl(MAIN_LINK, methodname: "MethodName", param: "ParametterInDictionary", image: "UploadImage", withImageName: "ImageParametterString") { (Success, responceOBJ) in
        if Success == true
        {
            print("Your image is uploaded")
        }
        else
        {
            print("Fail")
        }
    }

然后,您将Web服务的错误代码设置为服务器站点以显示错误,并且在您获得正确的成功之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM