2017-09-29 35 views
0

cURLを使用してファイルのコンテンツを「正しく」アップロードするにはどうすればよいですか?CURLを使用したファイルコンテンツの投稿

多くの説明と質問があります。ここで、tmpファイルは、ファイルに@prefixを付けてcurlで送信するか、curlFile APIを使用します。私の使用例では、私はtmpファイルを作成したくないだけで、投稿要求の内容としてfile_get_contents('php://input')の内容を投稿します。サーバーはマルチパート・フォーム要求を受け入れません。

PHP7に動作します切り取ら後:それは関係なく、ストリーム月の実際の内容は保持しているものを、JSONにコンテンツタイプを設定しないように醜い感じ

$body = file_get_contents('php://input'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

。しかし、それは動作するようです。残念ながら、私はPHPの本当の古いバージョンをサポートし、オプションを使い果たすように感じる必要があります。

私の質問は 上記の例は正しいですか?PHP 7の場合でも、それは改善されていますか? さらに:PHP 5.3.10でこの作業を行うために使用できる改善やオプションはありますか?この古いバージョンでは、投稿体は常に空であるようです。

答えて

1

は、最後に私が発見し、curl_setopt($curl, CURLOPT_POSTREDIR, 3);を追加on this blog

に答えるacutally空の体を持たずにPOSTリクエストを機能させるために必要なオプションでした。アップ


編集&ヘッド:このオプションは、あなたがあなたのリクエストがリダイレクトされることを期待する際に必要とされます。私はこの質問をして答えを投稿している間に間違いを犯しました。リクエストがhttpからhttpsにリダイレクトされているかどうかを確認してください。あなたは文字列としてリクエストボディを供給することができCURLOPT_POSTFIELDSを使用

:上記のリンクエバートポットのブログ記事からコピー


、。 は、そのメソッドを使用して、当社の以前の失敗した要求をアップロードしてみましょう:

<?php 

$curl = curl_init('http://example.org/someredirect'); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($curl, CURLOPT_POSTFIELDS, file_get_contents('largefile.json')); 

curl_exec($curl); 

?> 

これはまた、あなたが期待どおりに動作しません。 2番目の の/ someredirectへのリクエストは依然としてPOSTリクエストになりますが、空のリクエストボディで が送信されます。

これを修正するには、文書化されていないCURLOPT_POSTREDIRオプションを使用します。

<?php 

$curl = curl_init('http://example.org/someredirect'); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($curl, CURLOPT_POSTFIELDS, file_get_contents('largefile.json')); 
curl_setopt($curl, CURLOPT_POSTREDIR, 3); 

curl_exec($curl); 

?> 

PHPの変更履歴によると、これはPHP 5.3.2で追加されました、そして はPHPのバグ#49571に基づいて4つの値があります。

0 - >どんな行動1を設定していないが - >同じタイプのリダイレクトに従います。 リクエストは301リダイレクトのみです。 2 - >同じ30235リダイレクトだけの 要求の種類でリダイレクトします。 3 - >リダイレクトに従います。 と同じ種類のリクエストが301と302の両方のリダイレクトに対応しています。

関連する問題