CURL 无法使用文件流发送 POST 请求
CURL fail to send POST request with filestream
试图将带有其他数据的文件流发送到 API,但是 return 出现错误:
The video provided was null
这是我的代码:
function create_video($files) {
$api = "http://api.brightcove.com/services/post";
$local_file_list = $files['file']['tmp_name'];
foreach ($local_file_list as $local_file) {
try {
$fp = fopen($local_file, 'r');
$ch = curl_init();
if (FALSE === $ch) {
throw new Exception('failed to initialize');
}
//"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null}
$request = 'json={"params":{"encode_to":"MP4","create_multiple_renditions":"True","token":"' . WRITE_TOKEN . '"},"method":"create_video"}';
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($local_file));
$content = curl_exec($ch);
if (FALSE === $content) {
throw new Exception(curl_error($ch), curl_errno($ch));
}
die(var_dump(json_decode($content)));
return json_decode($content);
} catch (Exception $e) {
trigger_error(sprintf('Curl failed with error #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR);
}
}
}
Few things need to note:
- CURL does not return error , so it may not caused by CURL
- The
filesize($local_file)
has return the correct file size
- fopen($local_file, 'r'); return the stream type content, so the file is exist
如何解决?谢谢
API参考:
https://docs.brightcove.com/en/video-cloud/media/references/reference.html#Video_Write
更新:
感谢您的帮助,但现在 return 另一个错误:
POST methods require valid JSON-RPC in the POST body, with "method" and "params" properties
我对此有一些了解,因为当我查看请求负载时,它与正确负载略有不同:
我的当前版本:
------WebKitFormBoundary8VABz8KuNRE8Hepd
Content-Disposition: form-data; name="file[0]"; filename="big_buck_bunny.mp4"
Content-Type: video/mp4
------WebKitFormBoundary8VABz8KuNRE8Hepd--
正确的版本
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="JSONRPC"
{"params":{"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null},"encode_to":"MP4","create_multiple_renditions":"True","token":"VyocgALDnxU8HPvmnSnckgmXjoPlYWomc2La5Tn-evuAfsnSPJJoow.."},"method":"create_video"}
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="filePath"; filename="big_buck_bunny.mp4"
Content-Type: video/mp4
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="JSONView"
{"params":{"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null},"encode_to":"MP4","create_multiple_renditions":"True","token":"VyocgALDnxU8HPvmnSnckgmXjoPlYWomc2La5Tn-evuAfsnSPJJoow.."},"method":"create_video"}
------WebKitFormBoundaryCAB6WEANBJxoB3Op--
您可以将要上传的文件包装成 CURLFile
(PHP >= 5.5):
$cfile = new CURLFile($local_file, 'video/mp4', basename($local_file));
然后,添加到 CURLOPT_POSTFIELDS
,使其成为整个请求的一部分:
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => $cfile,
'JSONRPC' => '{"params":{"encode_to":"MP4","create_multiple_renditions":"True","token":"' . WRITE_TOKEN . '"},"method":"create_video"}';
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
在PHP 5.5之前你可以使用@
来表示一个文件:
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => "@$local_file",
'JSONRPC' => '{"params":{"encode_to":"MP4","create_multiple_renditions":"True","token":"' . WRITE_TOKEN . '"},"method":"create_video"}';
]);
试图将带有其他数据的文件流发送到 API,但是 return 出现错误:
The video provided was null
这是我的代码:
function create_video($files) {
$api = "http://api.brightcove.com/services/post";
$local_file_list = $files['file']['tmp_name'];
foreach ($local_file_list as $local_file) {
try {
$fp = fopen($local_file, 'r');
$ch = curl_init();
if (FALSE === $ch) {
throw new Exception('failed to initialize');
}
//"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null}
$request = 'json={"params":{"encode_to":"MP4","create_multiple_renditions":"True","token":"' . WRITE_TOKEN . '"},"method":"create_video"}';
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($local_file));
$content = curl_exec($ch);
if (FALSE === $content) {
throw new Exception(curl_error($ch), curl_errno($ch));
}
die(var_dump(json_decode($content)));
return json_decode($content);
} catch (Exception $e) {
trigger_error(sprintf('Curl failed with error #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR);
}
}
}
Few things need to note:
- CURL does not return error , so it may not caused by CURL
- The
filesize($local_file)
has return the correct file size- fopen($local_file, 'r'); return the stream type content, so the file is exist
如何解决?谢谢
API参考:
https://docs.brightcove.com/en/video-cloud/media/references/reference.html#Video_Write
更新:
感谢您的帮助,但现在 return 另一个错误:
POST methods require valid JSON-RPC in the POST body, with "method" and "params" properties
我对此有一些了解,因为当我查看请求负载时,它与正确负载略有不同:
我的当前版本:
------WebKitFormBoundary8VABz8KuNRE8Hepd
Content-Disposition: form-data; name="file[0]"; filename="big_buck_bunny.mp4"
Content-Type: video/mp4
------WebKitFormBoundary8VABz8KuNRE8Hepd--
正确的版本
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="JSONRPC"
{"params":{"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null},"encode_to":"MP4","create_multiple_renditions":"True","token":"VyocgALDnxU8HPvmnSnckgmXjoPlYWomc2La5Tn-evuAfsnSPJJoow.."},"method":"create_video"}
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="filePath"; filename="big_buck_bunny.mp4"
Content-Type: video/mp4
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="JSONView"
{"params":{"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null},"encode_to":"MP4","create_multiple_renditions":"True","token":"VyocgALDnxU8HPvmnSnckgmXjoPlYWomc2La5Tn-evuAfsnSPJJoow.."},"method":"create_video"}
------WebKitFormBoundaryCAB6WEANBJxoB3Op--
您可以将要上传的文件包装成 CURLFile
(PHP >= 5.5):
$cfile = new CURLFile($local_file, 'video/mp4', basename($local_file));
然后,添加到 CURLOPT_POSTFIELDS
,使其成为整个请求的一部分:
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => $cfile,
'JSONRPC' => '{"params":{"encode_to":"MP4","create_multiple_renditions":"True","token":"' . WRITE_TOKEN . '"},"method":"create_video"}';
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
在PHP 5.5之前你可以使用@
来表示一个文件:
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => "@$local_file",
'JSONRPC' => '{"params":{"encode_to":"MP4","create_multiple_renditions":"True","token":"' . WRITE_TOKEN . '"},"method":"create_video"}';
]);