質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1884閲覧

Swift5+moyaで画像投稿

kakignu

総合スコア21

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/06/27 07:29

編集2019/06/27 09:46

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

ログをみてもらったが、受け取れていない。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayabusabusash

2019/06/27 08:19

実際にPOSTを実行しているコードを見せていただくことは可能でしょうか? また、画像のアップロード以外( GETなどがあれば )はできていますか?
kakignu

2019/06/27 09:39 編集

画像のアップロード以外はできています。
hayabusabusash

2019/06/27 10:26

詳細な情報ありがとうございます! 他のAPIに問題がないならmultipartに変換しているところが怪しいですね。 imageDataが空のDataになってしまっていたりはしませんか? 画像の形式なども再度確認してみてはいかがでしょうか。 公開されているAPIではないので、あまりはっきりとした回答ができず申し訳ありません。
kakignu

2019/06/27 11:38

空で無いことまでは確認できています。 multipartの変換箇所に問題あると思うんですが、書き方的に間違ってますか? 特に間違いなさそうであれば、moyaではなく、通常のPOSTでとりあえず対応しようとは思ってます。
hayabusabusash

2019/06/27 11:55

以前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) お力になれず申し訳ありません。
kakignu

2019/06/27 12:19

試してみます。ありがとうございました。
guest

回答1

0

自己解決

ApiManager().request(Api.UploadFiles(caption: "file", filepath: pickedImage, fileName: "file")) { (response, error) in

仕様書には**captionとあったんですが、固定でfile**と記述しないと駄目みたいでした。

投稿2019/07/12 05:45

kakignu

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問