使用php和wget将文本作为文件上传为POST(multipart / form-data)

时间:2012-09-09 17:36:26

标签: php file-upload cgi wget

我正在使用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检索 $ randfile和$ randname。

带有$ rawfile的注释行试图发送原始的urlencoded内容而不是文件:有人说它是一个可行的替代方案但不适合我,或者至少我没有正确编码。

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

无论如何,logfile.txt都是空的。

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

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

1 个答案:

答案 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);

干杯!