【问题标题】:PHP Curl upload, post values in order as set in arrayPHP Curl上传,按数组中设置的顺序发布值
【发布时间】:2017-03-21 23:50:18
【问题描述】:

我在将带有 cURL 的文件上传到远程服务器时遇到问题。 仅当 POST 变量按顺序排列时,远程服务器才接受该文件。 就我而言:sid、cmd、uploadfile 我按这个顺序用一个简单的 HTML 上传表单对其进行了测试,一切正常。但是如果我替换输入字段的顺序,比如:cmd、sid、uploadfile 它拒绝我的上传。

所以这是我的 cURL 代码,它不会按照我在数组中设置的顺序发送变量。 如何强制 cURL 按照设置变量的顺序进行 POST。

$file = "/var/www/html/dl/big.mp4";

$target_url = 'http://upload.site/uploadpage';
$file_name_with_full_path = realpath($file);
$post = array('sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>'@'.$file_name_with_full_path);

$ch = curl_init();
$browser = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0';
curl_setopt($ch, CURLOPT_USERAGENT, $browser);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding: gzip, deflate',
'Accept-Language: en-US,en;q=0.5',
'Cache-Control: max-age=0',
'Connection: keep-alive',
'Host: upload.sitehost',
    )                                                                 
);    
$result=curl_exec($ch);
curl_close ($ch);
echo $result;

【问题讨论】:

    标签: php curl post upload


    【解决方案1】:

    PHP documentation 这么说CURLOPT_POSTFIELDS

    此参数可以作为 urlencoded 字符串(如 'para1=val1&para2=val2&...')或以字段名称作为键、字段数据作为值的数组形式传递。

    所以尝试改用http_build_query()

    <?php
    $post = array('sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>'@'.$file_name_with_full_path);
    $post = http_build_query($post);
    ...
    

    但是,设置CURLOPT_SAFE_UPLOAD 并不是一个好主意。相反,您应该使用curl_file_create(),因此您的最终代码可能如下所示:

    <?php
    $file = "/var/www/html/dl/big.mp4";
    
    $target_url = 'http://upload.site/uploadpage';
    $file_name_with_full_path = realpath($file);
    $post = [
        'sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO',
        'cmd' => 'uploadVideoFiles',
        'uploadfile'=>curl_file_create($file_name_with_full_path)
    ];
    $post = http_build_query($post);
    
    $ch = curl_init($target_url);
    curl_setopt_array($ch, [
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0',
        CURLOPT_POSTFIELDS => $post,
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
    ]);
    $result = curl_exec($ch);
    curl_close($ch);
    echo $result;
    

    【讨论】:

    • 我也已经尝试了 http_build_query() 的 urlencoded curlop_postfields。我得到响应 1,打印出 curl_exec($ch);但我需要这样的 JSON 响应:"response":{"code":0,"vcode":"u354DrwWnEIZUD2x"}} 如果发布顺序不是 sid,cmd,uploadfile,则响应为 {"response":{"code":2}}
    • 我测试了你的代码,仍然给我结果:1,也许没问题,但我需要 json 响应
    • 这似乎不太可能。也许它在你这边缓存,或者服务器没有返回你认为的内容。
    • 无论如何感谢 curl 文件的创建。我现在正在使用这种方式。旧的已弃用。
    • 不需要感谢,但点个赞就好了!很高兴能提供帮助。
    【解决方案2】:

    我解决了问题,是我的错,cmd不是

    'cmd' => 'uploadVideoFiles'
    

    原来是:

    'cmd' => 'uploadVideoFile'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2011-12-28
      相关资源
      最近更新 更多