将PHP cURL与可流化API一起使用时出现问题

将PHP cURL与可流化API一起使用时出现问题,php,curl,Php,Curl,我希望使用可流化的API和带有cURL的PHP构建一个视频上传 我想要实现的是: 用户填写信息表格,并从计算机/设备中选择要上载的视频文件 提交表单,PHP从那里处理它,与Streamable API对话,通过表单将视频上传到我的Streamable帐户,然后从Streamable返回shortcode,让我将其与其他信息一起存储在MySQL数据库中 我尝试过通过终端使用curl命令,并取得了成功。但是,我在通过php表单提交实现它时遇到了一些问题 这是我在terminal中使用的上传命令的一个

我希望使用可流化的API和带有cURL的PHP构建一个视频上传

我想要实现的是:

  • 用户填写信息表格,并从计算机/设备中选择要上载的视频文件
  • 提交表单,PHP从那里处理它,与Streamable API对话,通过表单将视频上传到我的Streamable帐户,然后从Streamable返回shortcode,让我将其与其他信息一起存储在MySQL数据库中
  • 我尝试过通过终端使用curl命令,并取得了成功。但是,我在通过php表单提交实现它时遇到了一些问题

    这是我在terminal中使用的上传命令的一个示例,该命令有效:

    curl https://api.streamable.com/upload -u my_email:my_pass -F file=@path/to/file.mp4
    
    有了PHP,我有了一个非常简单的cURL脚本,这要感谢大量的在线帮助。我想你可以说我对卷曲很陌生

    $url = 'https://api.streamable.com/upload -u my_email.com:my_pass -F file=@path/to/file.mp4';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec ($ch);
    curl_close ($ch);
    
    这样,我得到了一个HTTP 400错误。

    ..400范围内的代码表示客户端错误

    我想这就是为什么把我搞砸了

    我试过这样做,但我得到了同样的错误

    $pass = 'my_email:my_pass';
    $postFields = array(
     'file' => '/path/to/file.mp4',
     'title' => 'Example Title'
    );
    $url = 'https://api.streamable.com/upload';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_USERPWD, $pass);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec ($ch);
    curl_close ($ch);
    
    我使用了
    print_r(curl_getinfo($ch))查看发生了什么,这就是它所吐出的内容-也许这对一些帮助很有用:

    数组([url]=>https://api.streamable.com/upload
    
    -u my_email:my_pass-F file=@/Path/to/file.mp4[内容类型]=>[http_代码]=>400[标题大小]=>66[请求大小]=>277[文件时间]=>-1[ssl_验证结果]=>0[重定向计数]=>0[总时间]=>0.36033[姓名查找时间]=>0.00138[连接时间]=>0.082871[上传时间]=>0.283219[上传大小]=>0[下载速度]=>0[上传速度]=>0[下载内容长度]=>0[上传内容长度]=>275[开始传输时间]=>0.36031[重定向时间]=>0[重定向url]=>0[主ip]=>xx.xx.xxx.xxx[认证信息]=>Array()[主端口]=>443[本地ip]=>192.168.0.1[本地端口]=>57288)

    这里有两件事需要更改:

    • CURLOPT\u SSL\u VERIFYPEER
      设置为
      false
      。它可用于验证对等方的证书。如果我们将其指定为false,它将接受任何服务器(对等方)证书

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      
      下面是一篇关于打开和关闭
      CURLOPT\u SSL\u VERIFYPEER
      的重要文章,

    • CURLOPT_POSTFIELDS
      用于指定我们希望随POST请求一起提交的完整数据。
      $POSTFIELDS
      数组应使用函数转换为URL编码的查询字符串,以便将其作为
      application/x-www-form-urlencoded
      发送

      curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));
      
    试试这个:

    $fields = array("file"=>curl_file_create("video.mp4"));
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.streamable.com/upload");
    curl_setopt($ch, CURLOPT_USERPWD, "email:pass");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );
    
    $result = curl_exec($ch);
    

    我认为curl\u file\u create很好,似乎使用@fileName不再适用于PHP5.5+

    是否值得在这里添加一个关于关闭证书验证的安全含义的注释?这可能不是每个人都能看到的。@halfer啊,好主意,我也应该添加它。给我一点时间。编辑:更新答案。Tha我已经做了上面提到的更改(注意安全问题),但它给了我相同的结果。我停止使用POSTFIELDS选项,只使用了直线整行
    $url
    选项。
    $url=str_replace(''%20','https://api.streamable.com/upload -u我的电子邮件:my_pass-F file=@/Path/to/file.mp4')$ch=curl\u init();curl\u setopt($ch,CURLOPT\u URL,$URL);curl\u setopt($ch,CURLOPT\u SSL\u VERIFYPEER,false);curl\u setopt($ch,CURLOPT\u CUSTOMREQUEST,“POST”);curl\u setopt($ch,CURLOPT\u RETURNTRANSFER,true);$server\u output=curl\u exec($ch);print\r(curl\u getinfo($ch));print\r(curl\u error($ch));print\r($server\u output);//这实际上在返回页上显示了可流式处理的404?curl_close($ch);
    现在,当我在线阅读关于URL空白的内容时,使用
    str_replace
    出现了404错误。可流式处理的404由输出打印的错误截图->