1

我正在使用 PHP + wget 在旧的 cgi-bin 控制面板网络到传真上上传文件。

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 是我的文件的完整服务器路径。这是一个简单的文件.txt

$randfile 和 $randname 在 HTML 输出中使用 preg_match 检索。

带有 $rawfile 的注释行是尝试发送原始 urlencoded 内容而不是文件:有人说这是一种可行的选择,但不适合我,或者至少我没有正确编码。

我还尝试直接发布到您在 urlredirect 中看到的 URL,但我得到相同的错误文件格式不正确,但如果我跳一步,我无法确保从 cgi 进行正确解析。

在任何情况下 logfile.txt 都是空的。

我知道 curl 会让我的生活更轻松,但是脚本所在的 ubuntu 平台只支持 wget,我觉得我已经成功了一半。

建议我调试它的方法。我不能通过 shell,因为我会丢失每次刷新时生成的随机名称。也许是 TCPdump?感谢您给我的任何建议,我认为这是绝对解决此问题的最终讨论。

4

1 回答 1

0

经过多年和痛苦,我得出结论,CURL 是正确的方法。这是我到目前为止(BASH)发送文件的代码片段:

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

还有一个聪明的解决方案 (PHP) 可以在不实际使用 any 的情况下获取这些文件,这对安全性也有好处:

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

干杯!

于 2020-03-27T09:40:44.390 回答