使用Alamofire从图库上传带有参数和标题的图片

时间:2017-09-28 08:41:27

标签: ios swift alamofire multipartform-data

我正在尝试上传图片,但也需要传递参数和标题,从谷歌获取有关参数的帮助,但也没有得到如何传递标题。传递下面的代码,请指导。

以下是我的代码:

if (request.requestType == "Multipart")
    {
        var strToken : String = ""
        if let access_token = UserDefaults.standard.string(forKey: "auth_token"){
            let tokenValue = String(format: "Token %@", access_token);
            strToken = tokenValue
        }

        let headers: HTTPHeaders = [
            "Authorization": strToken,
            "Content-Type": "multipart/form-data"
        ]

        let img = request.image 
        let imgData = UIImageJPEGRepresentation(img, 0.2)!
        do{

            let strURL = try strCompleteURL.asURL()
        Alamofire.upload(multipartFormData: { multipartFormData in
            multipartFormData.append(imgData, withName: "image_path",fileName: "file.jpg", mimeType: "image/jpg")
            for (key, value) in params {
                multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
            }
        },
                         to:strURL)
        { (result) in
            switch result {
            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (progress) in
                    print("Upload Progress: \(progress.fractionCompleted)")
                })

                upload.responseJSON { response in
                    if response.result.isSuccess {
                        print(response.result.value as Any)
                        if let data = response.data{
                            self.response.responseCode = response.response?.statusCode
                            self.processResult(data);
                        }
                    }
                }

            case .failure(let encodingError):

                    print(encodingError)
            }
        }
        }
        catch{

        }

以上代码尝试上传图片但由于缺少标题而未成功,请指导如何传递标题和参数。

由于

2 个答案:

答案 0 :(得分:3)

您好我使用了这样的标题

func uploadImage( image:UIImage, url:String, _ successBlock:@escaping ( _ response: JSON )->Void , errorBlock: @escaping (_ error: NSError) -> Void ){

        let path =  baseUrl + url
        print(path)


        let headers = ["authorization": AppData().token]
        let imgData = UIImageJPEGRepresentation(image, 0.2)!

        let URL = try! URLRequest(url: path, method: .post, headers: headers)


        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(imgData, withName: "image",fileName: "file.jpg", mimeType: "file")
for (key, value) in params {
                    multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
                }
        }, with: URL) { (result) in
            switch result {
            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (progress) in
                    print("Upload Progress: \(progress.fractionCompleted)")
                })

                upload.responseJSON { response in
                    print(response.result.value)
                    if let value = response.result.value {
                        let json = JSON(value)
                        successBlock(json)
                    }
                }

            case .failure(let encodingError):
                print(encodingError)
                errorBlock(encodingError as NSError)

            }
        }

    }

答案 1 :(得分:0)

Alamofire .upload()功能提供的参数比您使用的参数多。 (这可以在他们的pod文件夹中的Alamofire.swift文件中看到)

public func upload(
multipartFormData: @escaping (MultipartFormData) -> Void,
usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold,
to url: URLConvertible,
method: HTTPMethod = .post,
headers: HTTPHeaders? = nil,
encodingCompletion: ((SessionManager.MultipartFormDataEncodingResult) -> Void)?)
{
    return ...
}

在那里你可以看到你没有使用的标题的参数。

如果不自行运行代码并检查所有内容,这将是我最好的假设你的标题将去哪里