特定の URL を使用して、リモート サーバー上の PHP フォームにファイルをアップロードしたいと考えています。アップロード フォームはファイル アップロード フォーム ( Multipart/form-data
) であり、スクリプトはローカル ファイルを取得して、そのフォームに送信する必要があります。
ファイルはやや大きいですが、フォーム ファイルのサイズ制限は 1GB で問題ありません。しかし、もっと切迫しているのは、いくつかの状況により、ファイルをストリームとして送信する必要があることです!
これは、ファイルを 1 行ずつ読み取ってから、一時ファイルを作成せずにアップロードすることを意味しますCURLOPTS_POSTFILDS
。
要するに:
CURLOPTS_READFUNCTION
ファイルの内容を1行ずつ取得するには、(と思う)を使用する必要があります- メソッドは
POST
- これは、リモートサーバーアップロードフォームでの通常のファイルアップロードをシミュレートする必要があります(そのため、何らかのダミーファイル名が必要になると思います)
これを行うために多くの方法を試しましたが、失敗しました。私は に非常にcURL
慣れていません。他の StackOverflow の質問や他のフォーラムから多くの情報を試してみましたが、役に立ちませんでした。
私はそれが不可能かもしれないという結論に達しましたが、私が言ったように、私は自分が何をしているのかほとんどわからないので、より経験豊富な人からの情報やガイドラインが必要です. CURLOPT_INFILE
これまでのところ、とはメソッドでCURLOPT_READFUNCTION
のみ作業していると思いますが、 を使用する必要があります。PUT
POST
長い質問で申し訳ありませんが、それが理にかなっていることを願っています。そして、助けや情報を事前にありがとう。
編集
提案されたコードは次のとおりです。
$fh = fopen('php://memory','rw');
fwrite( $fh, $content); //maybe write the contents to memory here?
rewind($fh);
$options = array(
CURLOPT_RETURNTRANSFER => true
,CURLOPT_SSL_VERIFYPEER => false
,CURLOPT_SSL_VERIFYHOST => 1
,CURLOPT_FOLLOWLOCATION => 0
,CURLOPT_HTTPHEADER => array(
'Content-type: multipart/form-data'
)
,CURLOPT_INFILE => $fh //I want to read the contents from this file
,CURLOPT_INFILESIZE => sizeof($content)
);
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, 'remote_form_url_here');
curl_setopt ($ch, CURLOPT_POST, true);
$post = array(
'userfile' => '@i_do_not_have_a_file_to_put_here;filename=myfile.txt'
);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt_array ($ch, $options);
//have the reading occur line by line when making the infile
curl_setopt($ch, CURLOPT_READFUNCTION, function($ch, $fd, $length) use ($fh) {
$line = fgets($fh);
if ($line !== false) return $line; else return false;
});
$response = curl_exec($ch);
echo $response;
fclose($fh);
このコードは主にあちこちで見つかった回答から組み立てられていますが、ファイル ハンドラーを使用する部分は適合していないようです。ファイルハンドラーを使用したいのですが、フォームを混乱させて内容がファイルであると考えさせ、ランダムなファイル名を渡す方法がないようです。
このコードは機能しません (フォームをまったく投稿できません)。または、一部のバリエーションは結果として禁止されています。
参考までに、これは私が実際の状況をエミュレートするために使用しているテストフォームです (実際のサーバーに大量のリクエストを送信したくない):
<form enctype="multipart/form-data" action="up.php" method="POST">
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
そして、これは背後にあるコードです:
$target_path = "./ups/";
$target_path = $target_path . basename( $_FILES['userfile']['name']);
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $target_path)) {
echo "The file ". basename( $_FILES['userfile']['name']).
" has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
var_dump($_FILES['userfile']);