1

PHP + wget を使用して、古い cgi-bin コントロール パネルの web-to-fax にファイルをアップロードしています。

cgi (言語がわからない) はファイル形式 (doc txt pdf) をチェックし、「ファイル形式が正しくありません」というエラーを返します。手動で行うと、すべて正常に動作します。

フォームは 6 つのステップで構成され、各ステップは非常に類似しており (送信先、再試行回数などを尋ねられます)、私の PHP + wget スクリプトは期待どおりに動作します (Cookie の処理、投稿、取得など)。

これは、フォームがどのように見えるかです (元から明るく翻訳されています):

<FORM ACTION="xyz_httpfileupload" METHOD="post" ENCTYPE="multipart/form-data">
Write the file with full path:

    <INPUT TYPE="FILE" NAME="sourcefile" size=40 maxlength=200>
    <input type=hidden name=destfile value="N527yb">
    <!-- this is a random generated filename -->

    <input type=hidden name=urlredirect value="./xyz_upload?destfile=N527yb&filename=/tmp/VOTU9.txt">
    <!-- this is another random generated filename -->

    <input type=submit name="Upload" value="Upload">
</FORM>

コード (およびいくつかのテスト) は、GET と POST の両方を使用できることを示しています。

これは私のコードで、説明が続きます:

$command =  ' wget --debug -qSO- --cookies=on --keep-session-cookies '.
            ' --save-cookies='.$cookie.' --load-cookies='.$cookie.
            ' --header="Content-Type:text/plain" '.
            ' --post-file="'.$file.'" '.
//          ' --post-data="sourcefile='.$rawfile.'" '.
            ' --post-data="'.
                'destfile='.$randfile.
                '&urlredirect=xyz_delivery?destfile='.$randfile.
                '&filename=/tmp/'.$randname.'.txt" '.
                '&pload=Upload "xyz_httpfileupload" ';
$data = shell_exec($command." && sleep 10 2>&1 | tee ".$dir."logfile.txt");

$cookie は、Cookie ファイルへの完全なサーバー パスです。期待どおりに動作します。

$file は、ファイルへの完全なサーバー パスです。シンプルな file.txt です

$randfile と $randname は、HTML 出力で preg_match を使用して取得されます。

$rawfile でコメントされた行は、ファイルの代わりに生の urlencoded コンテンツを送信しようとしています: 誰かがそれは有効な代替手段だと言いますが、私にとってはそうではありません, または少なくとも私はそれを正しくコーディングしませんでした.

また、urlredirect に表示されている URL に直接投稿しようとしましたが、同じエラー ファイル形式が正しくありませんが、ステップをジャンプすると cgi からの正しい解析を保証できません。

いずれにせよ、logfile.txt は空のままでした。

curl が私の生活を楽にすることはわかっていますが、スクリプトが存在する ubuntu プラットフォームは wget しかサポートしておらず、道半ばだと感じています。

それをデバッグする方法についてアドバイスしてください。更新のたびに生成されたランダムな名前が失われるため、シェル経由ではできません。おそらくTCPdump?アドバイスをいただければ幸いです。これは、この問題を確実に解決するための究極の議論だと思います。

4

1 に答える 1

0

何年にもわたって苦労した結果、私は CURL がその方法であると結論付けました。これは、ファイルを送信するためにこれまで (BASH) で動作する私のコード スニペットです。

formname="data=@"$HOME/samplefile.txt
$(curl -X POST -F $formname "http://www.mywebsite.com/form.php")

そして、実際に を使用せずにこれらのファイルを取得するための巧妙なソリューション (PHP) は、セキュリティにも適しています。

$tmp_name = $_FILES["data"]["tmp_name"];
$name = "final_folder/".$_FILES['data']['name'];
move_uploaded_file($tmp_name,$name);

乾杯!

于 2020-03-27T09:40:44.390 に答える