5

我想将文件上传到具有特定 URL 的远程服务器上的 PHP 表单。上传表单是一个文件上传表单 ( Multipart/form-data),我的脚本应该获取一个本地文件,并将其发送到该表单。

文件有点大,但form文件大小限制为1GB,没问题。但更紧迫的是,由于某些情况,我必须将文件作为流发送!

这意味着逐行读取文件,然后以某种方式上传它,而无需创建临时文件以通过CURLOPTS_POSTFILDS.

简而言之:

  • 我需要使用CURLOPTS_READFUNCTION(我认为)逐行获取文件的内容
  • 该方法必须是POST
  • 这必须模拟远程服务器上传表单上的常规文件上传(所以我想我需要某种虚拟文件名)

我已经尝试了很多方法来做到这一点,但我失败了。我很新cURL,我尝试了很多来自其他 StackOverflow 问题和其他论坛的信息,但无济于事。

我得出的结论是,这可能是不可能的,但正如我所说,我对自己在做什么一无所知,所以我需要一些更有经验的人提供的信息或指导。到目前为止,我认为CURLOPT_INFILE并且CURLOPT_READFUNCTION只使用PUT方法,但我必须使用POST.

抱歉问了这么长的问题,我希望它是有道理的。并提前感谢任何帮助或信息。

编辑

这是建议的一些代码:

$fh = fopen('php://memory','rw');
fwrite( $fh, $content); //maybe write the contents to memory here?
rewind($fh);


$options = array(
    CURLOPT_RETURNTRANSFER  => true
    ,CURLOPT_SSL_VERIFYPEER => false
    ,CURLOPT_SSL_VERIFYHOST => 1
    ,CURLOPT_FOLLOWLOCATION => 0
    ,CURLOPT_HTTPHEADER     => array(
        'Content-type: multipart/form-data'
    )
    ,CURLOPT_INFILE         => $fh //I want to read the contents from this file
    ,CURLOPT_INFILESIZE     => sizeof($content)
);
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, 'remote_form_url_here');
    curl_setopt ($ch, CURLOPT_POST, true);
    $post = array(
         'userfile' => '@i_do_not_have_a_file_to_put_here;filename=myfile.txt'
    );
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $post);
    curl_setopt_array ($ch, $options);


    //have the reading occur line by line when making the infile
    curl_setopt($ch, CURLOPT_READFUNCTION, function($ch, $fd, $length) use ($fh) {
    $line = fgets($fh);
    if ($line !== false) return $line; else return false;
    });


    $response = curl_exec($ch);

    echo $response;
    fclose($fh);

这段代码主要是根据周围找到的答案组装而成,但使用文件处理程序的部分似乎不合适。我想使用文件处理程序,但似乎没有办法将表单混淆为认为内容是文件并传递一些随机文件名。

此代码甚至不起作用(根本无法发布表单),或者它的某些变体甚至显示被禁止。

仅供参考,这是我用来模拟真实情况的测试表格,直到我让它工作(不想向真实服务器发送大量请求):

<form enctype="multipart/form-data" action="up.php" method="POST">


                Send this file: <input name="userfile" type="file" />
                    <input type="submit" value="Send File" />
            </form> 

这是背后的代码:

$target_path = "./ups/";

$target_path = $target_path . basename( $_FILES['userfile']['name']); 

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['userfile']['name']). 
    " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
}

var_dump($_FILES['userfile']);
4

1 回答 1

1

如果在浏览器中运行正常,您可以使用 chrome 开发工具。在网络选项卡上,找到发布请求。右键单击 -> 复制为 cURL 。

于 2014-05-14T20:32:49.067 回答