使用ios swift中的alamofire 5从multipartformdata上传带有参数的文件

问题描述 投票:2回答:4

我正在尝试使用参数上传文件(multipartformdata)但我无法使用新版Alamofire 5,如果您对Alamofire 5有一些经验,请与我分享。

 func uploadPluckImage(imgData : Data, imageColumnName : String,  url:String,httpmethod:HTTPMethod,completionHandler: @escaping (NSDictionary?, String?) -> ()){
    let token = UserDefaults.standard.string(forKey: PrefKeys.loginToken) ?? ""
    let authorization = ["Authorization" : "Bearer \(token)"]
    let parameters: Parameters?
    parameters = [
        "garbageCollector": 0,
        "stuff_uuid": "2b4b750a-f4a6-4d61-84ce-7c42b5c030ee",
        "delete_file" : ""
    ]
    let headers : HTTPHeader?
    headers = ["Authorization" : "Bearer \(token)"]
    let imageURl = "http://68.183.152.132/api/v1/stuff/uploader"


    AF.upload(multipartFormData: { (multipart: MultipartFormData) in
        let imageData = self.firstImage.image?.jpegData(compressionQuality: 0.7)
            multipart.append(imageData, withName: "file", fileName: "file.png", mimeType: "image/png")

        for (ker, value) in parameters!{
            multipart.append(value as! String).data(using: .utf8)!, withName: key)
        }
    },usingThreshold: UInt64.init(),
       to: imageURl,
       method: .post,
       headers: headers,
       encodingCompletion: { (result) in
        switch result {
        case .success(let upload, _, _):
            upload.uploadProgress(closure: { (progress) in
              print("Uploading")
            })
            break
        case .failure(let encodingError):
            print("err is \(encodingError)")
                break
            }
        })
}
ios swift alamofire multipartform-data swift4.2
4个回答
3
投票

上传方法在Alamofire 5中稍有变化

func upload(image: Data, to url: Alamofire.URLRequestConvertible, params: [String: Any]) {
    AF.upload(multipartFormData: { multiPart in
        for (key, value) in params {
            if let temp = value as? String {
                multiPart.append(temp.data(using: .utf8)!, withName: key)
            }
            if let temp = value as? Int {
                multiPart.append("\(temp)".data(using: .utf8)!, withName: key)
            }
            if let temp = value as? NSArray {
                temp.forEach({ element in
                    let keyObj = key + "[]"
                    if let string = element as? String {
                        multiPart.append(string.data(using: .utf8)!, withName: keyObj)
                    } else
                        if let num = element as? Int {
                            let value = "\(num)"
                            multiPart.append(value.data(using: .utf8)!, withName: keyObj)
                    }
                })
            }
        }
        multiPart.append(image, withName: "file", fileName: "file.png", mimeType: "image/png")
    }, with: url)
        .uploadProgress(queue: .main, closure: { progress in
            //Current upload progress of file 
            print("Upload Progress: \(progress.fractionCompleted)")
        })
        .responseJSON(completionHandler: { data in
            //Do what ever you want to do with response
        })
}

希望对你有帮助


1
投票

这对我来说使用Swift 4.2或更高版本。请试试这个

let url = "http://google.com" /* your API url */

let headers: HTTPHeaders = [
    /* "Authorization": "your_access_token",  in case you need authorization header */
    "Content-type": "multipart/form-data"
]

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

    if let data = imageData{
        multipartFormData.append(data, withName: "image", fileName: "image.png", mimeType: "image/png")
    }

}, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
    switch result{
    case .success(let upload, _, _):
        upload.responseJSON { response in
            print("Succesfully uploaded")
            if let err = response.error{
                onError?(err)
                return
            }
            onCompletion?(nil)
        }
    case .failure(let error):
        print("Error in upload: \(error.localizedDescription)")
        onError?(error)
    }
}

0
投票
// I am using Alamofire  method
 func sendIMAGeAndParamsAndDoc(urlString:String,imageData:[String:Data],documentData : [String:Data],params:[String:AnyObject], success: @escaping (AnyObject) -> Void,failure: @escaping(Error)  -> Void) {
        if (NetworkReachabilityManager()?.isReachable)!{
            let url = try! URLRequest.init(url: urlString, method: .post, headers: nil)
            Alamofire.upload(multipartFormData: { (formdata) in
                for (key, value) in params {
                    formdata.append(value.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue).rawValue)!, withName: key)
                }
                for (key,value) in imageData{
                    formdata.append(value, withName: key, fileName: "a.jpeg", mimeType: "image/jpeg")
                }

                for (key,value) in documentData{
                    if self.ofExtension(ext: "pdf") == true{
                        formdata.append(value, withName: key, fileName: "a.pdf", mimeType: "application/pdf")
                    }else{
                        formdata.append(value, withName: key, fileName: "a.xls", mimeType: "application/octet-stream")}
                }

            }, with: url) { (encodingResult) in
                switch encodingResult{
                case .success(let upload,_,_):
                    upload.responseJSON(completionHandler: { (response) in
                        switch response.result{
                        case .success(_):
                            if (response.response?.statusCode == 200){
                                if let value = response.result.value {
                                    success(value as AnyObject)
                                    print(value)
                                }
                            }
                            else{
                                let value = response.result.value as? [String:Any]
                                let message = value!["error_message"] as? String

                            }
                            break
                        case .failure(let error):
                            print(error)
                            break
                        }
                    })
                    break
                case .failure(let error):
                    print(error)
                    break
                }
            }
        }
        else{
        }

    }
// and use this func like this

sendIMAGeAndParams(urlString: "baseUrl", imageData: ["images" : imageArr as! Array<Data>], header: "", params: ["":""], success: { (success) in
            print(success)

        }) { (failure) in
            print(failure)

        }

-1
投票

这是我如何从Alamofire 5的快速5应用程序上传图像和视频。

图片

    /**
     Send Image to server
     */

    func Post(imageOrVideo : UIImage?){  

    let headers: HTTPHeaders = [
        /* "Authorization": "your_access_token",  in case you need authorization header */
        "Content-type": "multipart/form-data"
    ]


        AF.upload(
            multipartFormData: { multipartFormData in
                multipartFormData.append(imageOrVideo!.jpegData(compressionQuality: 0.5)!, withName: "upload_data" , fileName: "file.jpeg", mimeType: "image/jpeg")
        },
            to: "http://ip.here.--.--/new.php", method: .post , headers: headers)
            .response { resp in
                print(resp)               

        }
}

您可以创建临时资源并使用临时URL(适用于视频):

/**
 Send video to server
 */
func PostVideoUrl(url : URL){

    let headers: HTTPHeaders = [
        "Content-type": "multipart/form-data"
    ]        

    AF.upload(
        multipartFormData: { multipartFormData in
            multipartFormData.append(url, withName: "upload_data" , fileName: "movie.mp4", mimeType: "video/mp4")
    },
        to: "http://ip.here.--.--/newVideo.php", method: .post , headers: headers)
        .response { resp in
            print(resp)

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.