phpからmultipartでデータをアップロードするにはどうするの?
multipartを使うとPOSTデータ以外にCSVファイル、zipファイルなどをアップロードできます。
PHPを使った方法を記載します。multipart/form-data
を利用してPOSTデータを送るには、cURLライブラリを使用するのが一般的です。
この方法を使うとCSVや画像などのファイルや他のデータを含めた複合的なデータをPOSTできます。
以下、PHPのサンプルです。
<?php
// 送信先URL
$url = 'https://example.com/upload';
// POSTデータの準備
$postData = [
'username' => 'test_user',
'file' => new CURLFile('/path/to/your/file.jpg', 'image/jpeg', 'file.jpg')
];
// cURLセッションの初期化
$ch = curl_init();
// オプションの設定
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// POSTリクエストの実行
$response = curl_exec($ch);
// エラーチェック
if ($response === false) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo 'Response: ' . $response;
}
// cURLセッションを閉じる
curl_close($ch);
?-->
**CURLFile
**クラスを使用してファイルを送信しています。
MIMEタイプは'image/jpeg'のように指定します。
その他
**CURLOPT_RETURNTRANSFER
**をtrue
にすることで、リクエストの応答をcurl_exec()
の戻り値として取得します(画面に直接出力しない)。multipart/form-data
はフォームからファイルとテキストデータを同時に送信する場合に使用されるエンコーディングで、ファイルアップロードに適していますがプログラムからアップロードする場合は、上記を参考にcURLを利用すると便利です。
その他言語を利用したmultipartの方法としてASPを利用した例を下記に記載します。IISを利用した場合は応用できるのでASP.NETなどで利用できます。
objXmlHttp.Open "POST", strUrl, False
objXmlHttp.SetRequestHeader "Content-Type", "multipart/form-data; boundary=""" & strBoundary & """"
strPostData = "--" & strBoundary & vbCrLf
strPostData = strPostData & "Content-Disposition: form-data; name=""access_token""" & vbCrLf & vbCrLf
strPostData = strPostData & strToken & vbCrLf
strPostData = strPostData & "--" & strBoundary & vbCrLf
strPostData = strPostData & "Content-Disposition: form-data; name=""f""" & vbCrLf & vbCrLf
strPostData = strPostData & "json" & vbCrLf
strPostData = strPostData & "--" & strBoundary & vbCrLf
strPostData = strPostData & "Content-Disposition: form-data; name=""csv_file""; filename=""csvfile.csv""" & vbCrLf
strPostData = strPostData & "Content-Type: text/plain" & vbCrLf & vbCrLf
strPostData = strPostData & """E-Mail""" & vbCrLf
strPostData = strPostData & strDelListData
strPostData = strPostData & "--" & strBoundary & "--"
objXmlHttp.send strPostData
If objXmlHttp.readyState = 4 And objXmlHttp.Status = 200 Then
'アップロードOK
End If
なお、サーバ間でやり取りする場合は、上記のようにソケット通信を利用したやり方も可能です。
multipartを利用したアップロードはあまり例がないので、ぜひ上記を活用してください。