5

特定の URL を使用して、リモート サーバー上の PHP フォームにファイルをアップロードしたいと考えています。アップロード フォームはファイル アップロード フォーム ( Multipart/form-data) であり、スクリプトはローカル ファイルを取得して、そのフォームに送信する必要があります。

ファイルはやや大きいですが、フォーム ファイルのサイズ制限は 1GB で問題ありません。しかし、もっと切迫しているのは、いくつかの状況により、ファイルをストリームとして送信する必要があることです!

これは、ファイルを 1 行ずつ読み取ってから、一時ファイルを作成せずにアップロードすることを意味しますCURLOPTS_POSTFILDS

要するに:

  • CURLOPTS_READFUNCTIONファイルの内容を1行ずつ取得するには、(と思う)を使用する必要があります
  • メソッドはPOST
  • これは、リモートサーバーアップロードフォームでの通常のファイルアップロードをシミュレートする必要があります(そのため、何らかのダミーファイル名が必要になると思います)

これを行うために多くの方法を試しましたが、失敗しました。私は に非常にcURL慣れていません。他の StackOverflow の質問や他のフォーラムから多くの情報を試してみましたが、役に立ちませんでした。

私はそれが不可能かもしれないという結論に達しましたが、私が言ったように、私は自分が何をしているのかほとんどわからないので、より経験豊富な人からの情報やガイドラインが必要です. CURLOPT_INFILEこれまでのところ、とはメソッドでCURLOPT_READFUNCTIONのみ作業していると思いますが、 を使用する必要があります。PUTPOST

長い質問で申し訳ありませんが、それが理にかなっていることを願っています。そして、助けや情報を事前にありがとう。

編集

提案されたコードは次のとおりです。

$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']);
4

1 に答える 1