php – 使用cURL执行流(逐行)通过POST使用MULTIPART / FORM-DATA进行文件上传

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 使用cURL执行流(逐行)通过POST使用MULTIPART / FORM-DATA进行文件上传脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我想将文件上传到具有特定URL的远程服务器上的 PHP表单.上传表单是一个文件上传表单(Multipart / form-data),我的脚本应该采用本地文件,并将其发送到该表单.

文件有点大,但表单文件大小限制为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']);

解决方法

如果它在浏览器中正常工作,您可以使用chrome dev工具.在“网络”选项卡上,找到发布请求.右键单击 – >复制为cURL.

脚本宝典总结

以上是脚本宝典为你收集整理的php – 使用cURL执行流(逐行)通过POST使用MULTIPART / FORM-DATA进行文件上传全部内容,希望文章能够帮你解决php – 使用cURL执行流(逐行)通过POST使用MULTIPART / FORM-DATA进行文件上传所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。