

http通信で画像データをpostする方法に関して調べると、どの記事でも`Content-Type: multipart/form-
data`を指定するように書かれています。(もしくは画像バイナリデータをbase64でエンコードしてjson等に含めて送る方法もありますが)

自分の認識では、multipart/form-
dataは複数種類のデータを一度に送る際に指定する認識なんですが、自分が調べた範囲では画像の送信にはmultipart/form-
dataの指定が必須のように扱われていて違和感があります。

実際のところ画像の送信にはmultipart/form-dataの指定が必須なんでしょうか？  
単一の画像であれば、content-typeをimage/pngとかにして画像のバイナリデータ送るとか出来ないのかなと疑問なんですが。


CC BY-SA 4.0
2023-01-14T16:19:09.307
93340
2023-01-15T04:40:11.943
2023-01-15T04:40:11.943
3060
27271
question
http 画像 https
http通信で画像データをpostする場合のcontent-type指定について


画像に限らずファイルをフォームデータとして送信する場合は、ファイル以外のデータも含まれるので、`multipart/form-
data`を指定する必要があります。ファイル以外はテキストデータですが、ファイルはバイナリデータだからです。

[フォームデータの送信 - ウェブ開発を学ぶ |
MDN](https://developer.mozilla.org/ja/docs/Learn/Forms/Sending_and_retrieving_form_data#%E7%89%B9%E5%88%A5%E3%81%AA%E5%A0%B4%E5%90%88_%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E9%80%81%E4%BF%A1)

> データは複数の部分に分かれ、それぞれのファイルや文字列データがフォーム本体に含められているので、enctype の値を multipart/form-
> data に設定ください。

プログラムでファイルをアップロードする場合は、この限りではありません。

[ウェブアプリケーションからのファイルの使用 - Web API |
MDN](https://developer.mozilla.org/ja/docs/Web/API/File_API/Using_files_from_web_applications#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86)

> アップロードの MIME タイプは XMLHttpRequest 関数の overrideMimeType()
> を呼び出して設定します。この場合、一般的な MIME タイプを使用しています。用途によっては MIME タイプを設定する必要がない場合もあります。


CC BY-SA 4.0
2023-01-14T17:55:35.583
93342
2023-01-14T19:00:27.077
2023-01-14T19:00:27.077
4982
4982
93340
answer


> 実際のところ画像の送信にはmultipart/form-dataの指定が必須なんでしょうか？

アップロードされたファイルを受け取って処理する Web サーバーの Web アプリ次第です。

なぜ質問者さんが multipart/form-data に「違和感」を感じるのか分かりませんが、Web アプリが multipart/form-data
形式のデータを受け取って処理するように作ってあれば（ほとんどそうなっているはず）、「違和感」があろうとなかろうと、multipart/form-data
形式のデータを送信せざるを得ません。

例えば以下の記事の ASP.NET アプリの例。サーバー側で受け取って処理するには multipart/form-data
形式のデータが必須で、フレームワークからそのように作られてます。

ASP.NET Core MVC でファイルアップロード  
<http://surferonwww.info/BlogEngine/post/2020/01/19/aspnet-core-mvc-file-
upload.aspx>

フレームワークに備わっている CSRF 対策トークンも multipart/form-data 形式のデータの一部として送信されることにも注目してください。

> 単一の画像であれば、content-typeをimage/pngとかにして画像のバイナリデータ送るとか出来ないのかなと疑問なんですが。

やってやれないことはないと思いますが、送信側・受信側とも標準で用意されている機能を使わない独自実装をする必要があるはずで、そういう余計な手間をかける意味はまずないし、自分的にはそっちの方が違和感アリアリです。

どうしても form データとして送信できないケース、例えば以下の記事のように、ブラウザ上でユーザーが選んだ画像を JavaScript によって縮小して
JSON 形式にして送るということは自分もしたことがありますが。

canvas の画像をアップロード (その 2)  
<http://surferonwww.info/BlogEngine/post/2022/11/20/upload-image-drawn-on-
html5-canvas-2nd.aspx>


CC BY-SA 4.0
2023-01-15T01:05:56.580
93344
2023-01-15T01:05:56.580
51338
93340
answer