curlコマンドでファイルをPOSTパラメータとして送信する方法

目次

スポンサードリンク

curl コマンドでファイルを POST パラメータとして送信する方法

curl コマンドでファイルを POST パラメータとして送信するには、-F オプションを使用します。-F オプションを指定すると、type属性に”file”を指定したinput要素と同様に、ファイルを指定したパラメータ名で送信することができます。

基本的な構文は以下の通りです。

curl -X POST -F "<パラメータ名>=@<ファイルのパス>" <送信先のURL>

実行例と解説

以下例では、POSTパラメータ「csv_file」として、/tmp/test.csv を送信するよう指定しています。送信先は https://uchy.me/ で 最後の -v オプションは 通信の詳細を表示するためのオプションです。

[root@hostname tmp]# curl -X POST -F "csv_file=@/tmp/test.csv" https://uchy.me/ -v
* About to connect() to uchy.me port 443 (#0)
*   Trying 49.212.235.185...
* Connected to uchy.me (49.212.235.185) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate:
*       subject: CN=uchy.me
*       start date:  2月 23 10:04:01 2025 GMT
*       expire date:  5月 24 10:04:00 2025 GMT
*       common name: uchy.me
*       issuer: CN=R10,O=Let's Encrypt,C=US
> POST / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: uchy.me
> Accept: */*
> Content-Length: 204
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------6ef688e6f580
>
< HTTP/1.1 100 Continue
< HTTP/1.1 302 Found
< Server: nginx
< Date: Thu, 17 Apr 2025 01:34:25 GMT
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 205
< Connection: keep-alive
< Location: https://uchy.me/blog/
* HTTP error before end of send, stop sending
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://uchy.me/blog/">here</a>.</p>
</body></html>
* Closing connection 0

ファイル送信のため、Content-Typeヘッダが「multipart/form-data」となっています。「multipart/form-data」は、HTTP リクエストボディの Content-Type の一つで、主に Web ブラウザから Web サーバーへフォームデータを送信する際に用いられます。特に、ファイルアップロード を伴うフォーム送信に適しています。通常のフォームデータ送信に使われる application/x-www-form-urlencoded がテキストデータのみを扱えるのに対し、multipart/form-data はテキストデータに加えて、画像、動画、PDF などのバイナリファイルを含む複数の種類のデータを同時に送信できます。

boundary 以降の記述は、HTTP リクエストボディの各パートを区切るために使用される、ユニークな文字列です。

multipart/form-data 形式でデータを送信する際、フォームの各フィールド(テキストデータやファイルデータなど)が別々の「パート」として構成され、それらのパートを区切る役割を果たすのが boundary です。サーバーは、リクエストボディに含まれる boundary 文字列を認識することで、どこからどこまでが一つのパートであるかを判断できます。例えば、テキスト入力とアップロードされた画像ファイルを正しく分離して処理することができるようになります。



Linuxコマンドについて学べるおすすめ書籍
Linuxコマンドの知識は、プログラマにとって長く役立つ知識です。 私はこちらの書籍で一通り知識を抑えました。基本から丁寧に解説されています。

Linux教科書 図解でパッとわかる LPIC/LinuC
はじめてLPICを受ける方向け、手を動かしながらLinuxについて学びたい方におすすめ。30日間の無料体験もできる『Kindle Unlimited』でも読むことができます。

Linuxコマンドについて徹底的に学べるUdemy講座
もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 icon