ios - Swift 5 - 使用 Alamofire 上传 MultipartFormData 和图库中的图像

标签 ios swift multipartform-data image-uploading

我尝试将具有多个参数的图像从图库上传到服务器,但找不到任何有用的示例,因为其中大多数已被弃用。不知道从哪里开始。

func uploadImageAndData(){

       let periode = periodeField.text
       let kode_wilayah = kodeWilayahField.text
       let nama_petugas = namaPetugasField.text
       let upload_file = myImageView.image

        var parameters = [String:AnyObject]()
        parameters = ["periode":periode,
                      "kode_wilayah":kode_wilayah,
                      "nama_petugas":nama_petugas,
                      "uploaded_file": upload_file] as [String : AnyObject]

        let URL = "myURL"

        Alamofire.upload(
            multipartFormData: { (multipartFormData) in
                if let imageData = upload_file?.jpegData(compressionQuality: 0.3){
                    multipartFormData.append(imageData, withName: self.myFileName)
                }
        }, to:URL)
        { (result) in
            switch result {
            case .success(let upload, _ , _):
                upload.uploadProgress(closure: { (progress) in    
                    //print("uploding")
                    print("Upload Progress: \(progress.fractionCompleted)")
                })  
                upload.responseJSON { response in
                    debugPrint(response)
                    print("done")
                    print(response.result.value)   
                }    
            case .failure(let encodingError):
                print("failed")
                print(encodingError)  
            }
        }
    }

这来自图像选择器功能,从图库中选择图像没有问题。

@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
myImageView.image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
            let data = image.pngData()! as NSData
            data.write(toFile: localPath!, atomically: true)
            let photoURL = URL.init(fileURLWithPath: localPath!) 
        }
        self.dismiss(animated: true, completion: nil)  
    }

我可以获取路径,但无法将其提供给上传功能。我非常感谢您的帮助。

最佳答案

试试这个,我想这会对你有帮助。

    func imagupload(){
       let periode = periodeField.text
       let kode_wilayah = kodeWilayahField.text
       let nama_petugas = namaPetugasField.text
       let upload_file = myImageView.image

        var parameters = [String:AnyObject]()
        parameters = ["periode":periode,
                      "kode_wilayah":kode_wilayah,
                      "nama_petugas":nama_petugas,
                      "uploaded_file": upload_file] as [String : AnyObject]

        let URL = "myURL"


                        requestWith(endUrl: URL, imageData: myImageView.image!.jpegData(compressionQuality: 1.0), parameters: parameters, onCompletion: { (json) in
                            print(json)

                        }) { (error) in
                            print(error)

                        }
                    }


      func requestWith(endUrl: String, imagedata: Data?, parameters: [String : String], onCompletion: ((JSON?) -> Void)? = nil, onError: ((Error?) -> Void)? = nil){

        let url = endUrl


        let headers: HTTPHeaders = [

            "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: "imagename", fileName: "imagename.jpg", mimeType: "image/jpeg")
            }

        }, to:url,headers: headers)
        { (result) in
            switch result{
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    let json : JSON = JSON(response.result.value)
                     print(json)
                    if let err = response.error{
                        onError?(err)

                        return
                    }
                    onCompletion?(json)

                }
            case .failure(let error):
               //print("Error in upload: \(error.localizedDescription)")
                onError?(error)

            }

        }

    }

每次使用like时只使用imagupload函数,

self.imagupload()

关于ios - Swift 5 - 使用 Alamofire 上传 MultipartFormData 和图库中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749272/

相关文章:

ios - 将 tableview 设置为 static 仍然显示很多行

fonts - 如何在 SpriteKit 项目中使用自定义字体? - swift

jsp - 如何在多部分发布请求中传递参数

spring - CommonsMultipartResolver 搞乱了二进制编码

iphone - MonoTouch.Dialog 中的自定义 UIPickerView?

iphone - 解析自定义字符串给出错误的日期

iphone - UITabBar 中的单个选项卡不包含 UINavigationBar

ios - 减少解析 Collection View 中的加载时间

Swift 联合发布两次

android - 简单的 HttpURLConnection POST 文件 multipart/form-data 从 android 到 google blobstore