【问题标题】:Not able to upload camera images using Almofire multipart无法使用 Alamofire 多部分上传相机图像
【发布时间】:2019-11-22 02:36:18
【问题描述】:

我必须上传图片、音频、文件。我正在使用 Alamofire 上传。所有内容都已上传,包括截图等图库图像,但从相机拍摄的照片未上传。 这是我的代码:

func requestUploadFileWithMultipart(connectionUrl: String, param : [String: AnyObject], filePath: String?, _ callBack: @escaping (_ data: DataResponse<Any>?, _ error:Error?) -> Void) {

    let URLString  = MainURL + connectionUrl

    Alamofire.upload(multipartFormData: { multipartFormData in
        for (key, value) in param {
            let stringValue = "\(value)"
            multipartFormData.append(stringValue.data(using: String.Encoding.utf8)!, withName: key)
            print("Key: \(key), Value: \(stringValue)")
        }

        if filePath != "" {
            do {
                var fileData = try Data(contentsOf: URL(string: filePath!)!)
                let ext = URL(fileURLWithPath: filePath!).lastPathComponent.components(separatedBy: ".").last
                let mime = filePath?.mimeTypeForPath()
                let fileName = "\(Date().timeIntervalSince1970)".components(separatedBy: ".").first
                multipartFormData.append(fileData, withName: "file", fileName: "\(fileName ?? "file").\(ext ?? "")", mimeType: mime ?? "")
            } catch {
                print("error loading file in multipart")
            }
        }

    }, to:URLString) { (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 as Any)



                callBack(response, nil)
            }

        case .failure(let encodingError):
            print(encodingError)

            callBack(nil, encodingError)
        }
    }
}

【问题讨论】:

  • 这是什么意思?你有什么错误?应用程序崩溃或发生其他事情?
  • 如果使用您的代码上传的一切正常,那么我怀疑图像格式是罪魁祸首。也许您的后端不支持 HEIF 格式。尝试将图像转换为 JPG/PNG,然后尝试上传。
  • @SahilManchanda 我正在将拾取的图像转换为 .png 并将其保存到 docs 目录中。之后我上传它。
  • @KrutikaSonawala,很高兴您找到了原因。我建议你进一步调查。现在有两种情况 1. 连接失败(可能性较小) 2. 最大上传文件大小(询问您的后端开发人员允许文件上传多少 MB)
  • 是的。我问过,但他们说文件没有限制。所以我想知道为什么会这样。但是压缩它起作用了。所以我没有费心去要求他们改变。

标签: ios swift image-upload alamofire-request


【解决方案1】:

请尝试以下代码,我在我的一个项目中使用此代码。但请确保 API 适合分段上传。

Alamofire.upload(multipartFormData: {
        multipartFormData in
        if let img =  image {
            if let imageData = img.jpegData(compressionQuality: 0.4) {
                multipartFormData.append(imageData, withName: "cmt_img", fileName: "\(Date()).jpg", mimeType: "image/jpg")
            }
        }
        do {

            let theJSONData = try JSONSerialization.data(withJSONObject: param, options: JSONSerialization.WritingOptions(rawValue: 0))
            multipartFormData.append(theJSONData, withName: "data")
        } catch {}
    },usingThreshold: 0 ,to: baseURL + URLS.AddComment.rawValue, headers: appDelegate.headers, encodingCompletion: {
        encodingResult in switch encodingResult {

        case .success(let upload, _, _):
            upload.responseObject(completionHandler: { (response: DataResponse<AddCommentData>) in

                SVProgressHUD.dismiss()
                if (response.result.value != nil) {
                    showAlert(popUpMessage.uploadingSuccess.rawValue)
                }
                else {
                    showAlert(popUpMessage.someWrong.rawValue)
                }
            })

            break

        case .failure(let encodingError):
            SVProgressHUD.dismiss()
            print(encodingError)
            break
        }
    })
}

【讨论】:

    【解决方案2】:

    图像压缩对我有用。可能是大文件没有上传。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2018-10-07
      • 1970-01-01
      • 2020-03-06
      • 2023-03-23
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多