如何使用 Moya 在 Swift 中上传图片?

Posted

技术标签:

【中文标题】如何使用 Moya 在 Swift 中上传图片?【英文标题】:How to upload image in Swift using Moya? 【发布时间】:2019-06-29 16:27:05 【问题描述】:

我有一个项目,用户从他们的画廊或快照中选择图像,它应该被上传到远程服务器。

现在,如果我尝试使用放入 xcode 的静态图片上传,图片会上传,但当我使用 ImagePicker 并选择图片并将其传递给 ImageView 时,图片显示但无法上传到服务器。该应用程序不会崩溃,图像上传只是不去。有什么理由吗?任何帮助将不胜感激

NetworkAdapter.instance.uploadImage(status: "user", image: Img.image).subscribe(onNext:  check in
            print("CHECKOUT NOW \(check)")
        , onError:  error in
            print("CHECKOUT NOW \(error.localizedDescription)")
        ).disposed(by: disposeBag) 

我正在使用Moya 进行 API 调用

case .uploadImage(let data):
            let imageData = data.image.jpegData(compressionQuality: 1.0)
            let memberIdData = "\(data.status)".data(using: String.Encoding.utf8) ?? Data()
            var formData: [Moya.MultipartFormData] = [Moya.MultipartFormData(provider: .data(imageData!), name: "image", fileName: "user.jpeg", mimeType: "image/jpeg")]

【问题讨论】:

您的上传请求可能会被过早处理。您是否将 disposeBag 保留足够长的时间以完成请求? 当您说“不去”时,您是说您知道该请求从未发出,还是您说您不确定它是否已发送,而您只是知道它由于某种原因从未出现在服务器上?我可能想使用Charles 或WireShark 之类的工具同时查看工作静态图像场景和非工作拾取图像场景,看看它们是否在任何实质性方面有所不同。 顺便说一句,这个获取质量为 1.0 的 jpeg 的过程意味着您发送到服务器的图像与用户设备中的资产不完全相同,而且还要大得多。一旦您解决了这个问题,您可能需要考虑是否更愿意上传原始资产,或者您是否真的想通过UIImage 和 JPEG 表示来往返它。这取决于您的业务需求。 @Rob 你有什么建议 确认问题是否是请求未成功发出,或者请求是否已发送,但格式错误,导致服务器无法接受。就像我说的那样,我使用像Charles 这样的工具作为我的“当橡胶撞到路上”的工具,准确地确认通过电线发送的内容。配置这些工具需要一点时间,但它们对于诊断这类网络问题非常宝贵。 【参考方案1】:

试试这个: 更改 Jpeg 数据。

case .uploadImage(let data):
           let imageData = data.image.jpegData(compressionQuality: 0)
           let memberIdData = “\(data.status)“.data(using: String.Encoding.utf8) ?? Data()
           var formData: [Moya.MultipartFormData] = [Moya.MultipartFormData(provider: .data(imageData!), name: “image”, fileName: “user.jpeg”, mimeType: “image/jpeg”)]

【讨论】:

以上是关于如何使用 Moya 在 Swift 中上传图片?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用alamofire上传图库图片

使用 Moya 获取响应标头

我们如何使用 Moya 调试/查看通过 API 设置的请求?

Swift网络请求(Moya篇)

moya 与 RxSwift 使用

如何使用 Moya 框架重试请求