我正在使用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是我文件的完整服务器路径。这是一个简单的file.txt
使用HTML输出上的preg_match检索带有$ rawfile的注释行试图发送原始的urlencoded内容而不是文件:有人说它是一个可行的替代方案但不适合我,或者至少我没有正确编码。
我还尝试直接发布到你在urlredirect中看到的URL,但我得到的错误文件格式不正确,但如果我跳了一步,我无法保证从cgi中正确解析。
无论如何,logfile.txt都是空的。
我知道curl会让我的生活更轻松,但脚本所在的ubuntu平台只支持wget,我觉得我已经走了一半。
建议我调试它的方法。我不能通过shell,因为我会丢失每次刷新时生成的随机名称。也许TCPdump?感谢你给我的任何建议,我认为这是绝对解决这个问题的最终讨论。
答案 0 :(得分:0)
经过多年的艰辛,我得出的结论是CURL是这种方式。这是我到目前为止可用于发送文件的代码段:
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);
干杯!