带有 MultiPart 表单数据中的参数的图像上传在 Alamofire 4.0 中不起作用

Posted

技术标签:

【中文标题】带有 MultiPart 表单数据中的参数的图像上传在 Alamofire 4.0 中不起作用【英文标题】:Image upload with paramteres in MultiPartFormData is not working in Alamofire 4.0 【发布时间】:2017-02-08 05:25:36 【问题描述】:

我正在使用此功能在 Alamofire 的 post 方法中上传多个带有参数的图像。我的图片没有上传。我交叉检查了服务器上没有图像条目,但其他数据成功存储在 DB 中。 我在 Alamofire 3.0 中使用了这种方法,现在我更新到了 4.0 。其他 post 和 get 功能对我来说工作正常。

 static func callUploadApi (_ url: String , parameter:[String: String] , images: [URL] , imageParameterName:String ,showHud:Bool , handler: @escaping (_ result : NSMutableDictionary) -> Void )
    
        Alamofire.upload(multipartFormData:  multipartFormData in

            for (key, value) in parameter  // Add Paramters
            
                multipartFormData.append(value.data(using: .utf8 )! , withName: key)
            
            for imageUrl in images // Add Images
            
                multipartFormData.append(imageUrl, withName: imageParameterName)
            
        , to: "\(baseUrl)\(url)", method: .post,
                encodingCompletion:  encodingResult in
                    switch encodingResult 
                    case .success(let upload, _, _):
                        print(upload.progress)

                        upload.responseJSON   response in

                            if let JSON = response.result.value
                            
                                print("***********************************************")
                                print("JSON: \(JSON)")
                                print("***********************************************")                                
                                handler(JSON as! NSMutableDictionary)
                            
                        
                        break
                    case .failure(let encodingError):
                        print("error:\(encodingError)")
                    
        )
 

【问题讨论】:

提示:打印 curl 并将其与终端一起使用,这样您就会知道您的代码实际上在做什么。 我在邮递员中检查了它,它工作正常。当我尝试通过代码上传图像时,它没有上传。如何找出问题出在哪里? 您对 ATS 有疑问吗? google.co.jp/… 是的,我在 plist 中设置了它。其他 api 在应用程序中也可以正常工作,只有 multipartformdata 没有按预期工作。我必须使用它来发送具有多个参数的多个图像。 【参考方案1】:
func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) 

    let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
    let boundaryConstant = "------------0x0x0x0x0x0x0x0x";
    let contentType = NSString(format: "multipart/form-data;boundary=%@",boundaryConstant)
    mutableURLRequest.setValue(contentType as String, forHTTPHeaderField: "Content-Type")
    let uploadData = NSMutableData()
    uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData(NSString(format: "Content-Disposition: form-data; name=\"file\";filename=\"%@\"\r\n", self.imageURL).dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData("Content-Type: application/octet-stream\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData(imageData)

    for (key, value) in parameters 
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
    
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)

【讨论】:

感谢 Prabhat,但我正在使用 alamofire 作为 API,我也解决了这个问题。 @ChanWarde 你能说说你是怎么解决这个问题的吗? 等我给你贴方法。【参考方案2】:

这对我有用,我写这个是为了我的需要。任何人都可以根据需要进行更改。

 static func upload( _ url : String ,
                            parameter : [String : String] = [:],
                            arrayImage : [String : UIImage],
                            shouldShowHud : Bool = true,
                            completionHandler : @escaping (_ result : NSDictionary , _ status : Bool) -> Void )
        
            Alamofire.upload(multipartFormData:  multipartFormData in
                for (key, value) in parameter
                    multipartFormData.append(value.data(using: .utf8 )! , withName: key)
                

                for (key, value) in arrayImage 
                    if let imageData = UIImageJPEGRepresentation(imageUrl, 0.5)  
                        multipartFormData.append(imageData , withName: key, fileName: "file.jpeg", mimeType: "image/jpeg")
                    
                
            , to: MainUrl+url ,  method: .post, headers : Header,  encodingCompletion:  encodingResult in

                switch encodingResult
                case .success(let upload, _, _):
                    print("Upload Progress \(upload.uploadProgress.completedUnitCount) '\' \(upload.uploadProgress.totalUnitCount)")

                    upload.responseJSON   response in
                        if let JSON = response.result.value 
                            let status = (JSON as! NSDictionary)["status"] as? Bool
                            completionHandler(JSON as! NSDictionary , status!)
                         else  
                            let result : NSDictionary = ["message" : "Request Time out, please refresh again." as Any]
                            completionHandler( result as NSDictionary , false)
                        
                    
                    break
                case .failure:
                    let result : NSDictionary = ["message" : "Request Time out, please refresh again." ]
                    completionHandler( result as NSDictionary , false)
                    break
                
            
            )
        

【讨论】:

以上是关于带有 MultiPart 表单数据中的参数的图像上传在 Alamofire 4.0 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

通过带有 multipart/form-data 的表单发送的文件作为空对象发送

NativeScript Vue 发送带有表单数据的请求(multipart/form-data)

如何将带有表单数据的图像上传到api参数中?

如何将图像文件和表单数据从 Ajax 传递到 MVC 控制器

请求参数为空,在提交带有图像的表单数据 AJAX 后

如何使用带有 Rocket 的 abonander/multipart 解析多部分表单?