使用Alamofire在iOS中上传图片

4

我正在尝试使用Alamofire上传图片,但似乎没有成功上传。

    Alamofire.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(imgData, withName: "data", fileName: "\(Date().timeIntervalSince1970).jpg", mimeType: "image/jpg")
        multipartFormData.append(operaID.data, withName: "id")
    },
                     to: URL_CORDINATE)
    { (result) in
        switch result {
        case .success(let upload, _, _):

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

            upload.responseJSON { response in
                print("Upload image response:", response.result.value)
            }

        case .failure(let encodingError):
            print("Error while uploading image:", encodingError)
        }

我期望看到图片上传,但似乎正文有些问题(我应该将img和id放在正文中而不是作为参数传递!)。然而,在Postman中它确实有效:https://istack.dev59.com/f0mUd.webp

有任何错误输出吗? - alanpaivaa
输出没有错误。 - francesco la rosa
3个回答

1
您可以尝试这样做:

你的代码

Alamofire.upload(
                multipartFormData: { multipartFormData in
                    multipartFormData.append(imgData!, withName: "img", fileName: "jpg", mimeType: "image/jpeg")
            },
                to: UPLOAD_IMAGE_URL,
                encodingCompletion: { (encodingResult) -> Void in
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.responseJSON { response in
                            let result = response.data
                            do {
                                print("success")
                            }catch {
                                print("error")
                            }
                        }
                    case .failure(let encodingError):
                        print(encodingError)

                    }
            })

0

第一眼看起来缺少HTTP方法:.post,并且mimeType应为"image/jpeg"而不是"image/jpg"

看这个:

    Alamofire.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(imgData, withName: "data", fileName: "\(Date().timeIntervalSince1970).jpg", mimeType: "image/jpeg")
        multipartFormData.append(operaID.data, withName: "id")
    },
    to: YOUR_URL_HERE,
    method: .post,
    encodingCompletion: { result in
        switch result {
        case .success(let upload, _, _):

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

            upload.responseJSON { response in
                print("Upload image response:", response.result.value)
            }

        case .failure(let encodingError):
            print("Error while uploading image:", encodingError)
        }
    })

是否有任何服务器日志指示错误?您可以在服务器代码中添加断点,并在本地主机上运行以检查控制器中的内容吗?

如果服务器端点是http,请将其放入您的Info.plist中:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

我已尝试按照您的建议进行更改,但似乎仍然无法工作(当我打印由Alamofire给出的结果时,我得到:“CredStore - performQuery - Error copying matching creds”)。不确定原因! - francesco la rosa
你的URL是什么?它是http还是https?这个错误可能会出现在HTTP服务器端点。 - balazs630
在请求正文中使用“img”(图像)和“id”(例如44)访问http://artaugmentedreality.com/api/postpreview/。 - francesco la rosa
我已经将该域名添加到支持的HTTP域名列表中的info.plist中,但我仍然收到相同的错误!:( - francesco la rosa
你的 Info.plist 看起来怎么样?我可以进一步解释我的回答。 - balazs630

0
        Alamofire.upload(multipartFormData: { multipartFormData in
            if let img = image, let imageData = img.jpegData(compressionQuality: 0.6) {
                multipartFormData.append(imageData, withName: imageName, fileName: "temp.jpg", mimeType: "image/jpg")
            }
            for (key, value) in parameter ?? [:] {
                if value is String || value is Int {
                    multipartFormData.append("\(value)".data(using: .utf8)!, withName: key)
                }
            }
        }, to: url, headers: headers, encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _ , _ ):
                upload.responseJSON { response in
                    debugPrint(response)
                    if response.response?.statusCode == 200
                    {
                        if let jsonData = try? JSONSerialization.data(withJSONObject: response.result.value!, options: .prettyPrinted) {
                            print("Response: \n",String(data: jsonData, encoding: String.Encoding.utf8) ?? "nil")
                        }
                        success(response.result.value! as AnyObject)
                    }else
                    {
                        let res = response.result.value! as AnyObject
                        let msg = res["Message"] as? String
                        if msg != nil
                        {
                            failure(msg!)
                        }else
                        {
                            failure("")
                        }
                    }
                }
            case .failure(let encodingError):
                print(encodingError)
                failure(encodingError.localizedDescription)
            }
        })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接