Swift5+moyaで画像のPOSTがしたい
実装している内容は以下の通りです。サーバーサイドが既存のWeb版で動いているものをそのまま流用しており、かつエラーが404に丸められるため何も確認できません。
実装が間違っていればご指摘頂きたい次第です。よろしくおねがいします。
該当のソースコード
Swift
1import Moya 2 3extension Api { 4 struct UploadFiles: ApiTargetType { 5 typealias Response = FileUpload 6 7 var method: Moya.Method { 8 return .post 9 } 10 var path: String { 11 let pathString = "/api/resource_image" 12 return pathString 13 } 14 15 var task: Task { 16 let imageData = filepath!.pngData() ?? Data() 17 let formData: [Moya.MultipartFormData] = [Moya.MultipartFormData(provider: .data(imageData), name: "caption", fileName: "fileName.png", mimeType: "image/png")] 18 return .uploadMultipart(formData) 19 } 20 21 let caption: String? 22 let filepath: UIImage? 23 let fileName: String? 24 25 init(caption: String?, filepath: UIImage?, fileName: String?, companyCode: String?) { 26 self.caption = caption 27 self.filepath = filepath 28 self.fileName = fileName 29 } 30 } 31} 32 33struct FileUpload: Codable { 34 var id: Int 35 var fileableType: String 36 var fileableId: Int 37 var name: String 38 var digest: String 39 var url: String 40 var size: Int 41 var contentType: String 42 var createdAt: String 43} 44 45
呼び出し元 GetやPostで他のAPIは正常に動作しています。画像アップロードだけうまくいかない感じです。
Swift
1 func imagePickerController(_ imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 2 if let pickedImage = info[.originalImage] as? UIImage { 3 ApiManager().request(Api.UploadFiles(caption: "テスト", filepath: pickedImage, fileName: "file")) { (response, error) in 4 if let res = response { 5 DEBUG.LOG(res) 6 } 7 } 8 } 9 imagePicker.dismiss(animated: true, completion: nil) 10 } 11
ログをみてもらったが、受け取れていない。
実際にPOSTを実行しているコードを見せていただくことは可能でしょうか?
また、画像のアップロード以外( GETなどがあれば )はできていますか?
画像のアップロード以外はできています。
詳細な情報ありがとうございます!
他のAPIに問題がないならmultipartに変換しているところが怪しいですね。
imageDataが空のDataになってしまっていたりはしませんか?
画像の形式なども再度確認してみてはいかがでしょうか。
公開されているAPIではないので、あまりはっきりとした回答ができず申し訳ありません。
空で無いことまでは確認できています。
multipartの変換箇所に問題あると思うんですが、書き方的に間違ってますか?
特に間違いなさそうであれば、moyaではなく、通常のPOSTでとりあえず対応しようとは思ってます。
以前jpegで同じようにPOSTしようとしたことがあって、
質問者様とほとんど同じように記述して上手くいったので間違ってはいないと思うのですが...
その時は他にもパラメータがあったので完全に同じではありませんが、以下のように記述しました。
let imageData = image.jpegData(compressionQuality: 1.0) ?? Data()
let paramData = try! JSONSerialization.data(withJSONObject: parameters, options: [])
let multipartFormData = [MultipartFormData(provider: .data(imageData), name: "file", fileName: "image.jpg", mimeType: "image/jpg"),
MultipartFormData(provider: .data(paramData), name: "data")]
return .uploadMultipart(multipartFormData)
お力になれず申し訳ありません。
試してみます。ありがとうございました。
回答1件
あなたの回答
tips
プレビュー