我正在使用 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?感谢您给我的任何建议,我认为这是绝对解决此问题的最终讨论。