curl_exec 使用 php 上传框 api 中的文件失败
curl_exec for uploading files in box api using php fails
我可以使用以下命令在终端上使用 curl 上传文件:
curl https://upload.box.com/api/2.0/files/content \
> -H "Authorization: Bearer {access-code}" -X POST \
> -F attributes='{"name":"tested.png", "parent":{"id":"3804480350"}}' \
> -F file=@/Applications/MAMP/htdocs/BoxappTest/test.png
但是当我尝试使用 PHP 和以下代码执行相同操作时:
$filePath=realPath("./test.png");
$xmlfile = file_get_contents("codes.xml");
$codes_data = simplexml_load_string($xmlfile);
$access_token=$codes_data->access_code;
$destination_filename="tested.png";
$id="3804480350";
$ch= curl_init();
curl_reset($ch);
echo "Uploading file...",'<br>';
$post = '{"name":"'.$destination_filename.'", "parent":{"id":"'.$id.'"}}';
$postfields = Array("attributes"=>$post,"file" => "@".$filePath);
$headers= Array("Authorization: Bearer " . $access_token);
curl_setopt($ch, CURLOPT_URL, "https://upload.box.com/api/2.0/files/content");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$output=curl_exec($ch);
$info=curl_getinfo($ch);
curl_close($ch);
if(curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
}
foreach($info as $data => $part) {
echo $data."=".$part, '<br>';
}
echo "File uploaded...",'<br>';
var_dump($output);
它给我以下输出:
Uploading file...
content_type=text/html;charset=UTF-8
http_code=400
header_size=243
request_size=260
filetime=-1
ssl_verify_result=0
redirect_count=0
total_time=1.118914
namelookup_time=0.000738
connect_time=0.022878
pretransfer_time=0.100239
size_upload=335
size_download=0
speed_download=0
speed_upload=299
download_content_length=0
upload_content_length=335
starttransfer_time=1.10153
redirect_time=0
redirect_url=
primary_ip=74.112.185.182
certinfo=Array
primary_port=443
local_ip=10.0.0.188
local_port=50008
request_header=POST /api/2.0/files/content HTTP/1.1 Host: upload.box.com Accept: */* Authorization: Bearer {access-code} Content-Length: 335 Expect: 100-continue Content-Type: multipart/form-data; boundary=------------------------....
File uploaded...
string(0) ""
我浏览了各种网站,但其中 none 似乎适合我的问题。无论我做什么,content_type 都会保持 'text/html'。我试图在 header 和 post 字段中设置它。但是两者都没有用。我知道我正在正确获取访问代码并且它们是有效的。我不确定 curl 选项。设置 CURLOPT_VERBOSE 或检查错误也不会 return 任何东西。如果没有 CURLOPT_RETURNTRANSFER 选项,curl_exec return 是正确的。有人可以帮助我了解我在哪里犯了错误吗?
我无法使用 php 本身解决此问题,但使用 shell_exec() 到 运行 完整形式的 curl 命令确实有效。所以我坚持那个实现。
$cmd = "curl https://upload.box.com/api/2.0/files/content \
-H \"Authorization: Bearer $access_token\" -X POST \
-F attributes='{\"name\":\"$dest_name\",\"parent\": {\"id\":\"$parent_id\"}}' \
-F file=@\"$filePath\"";
$result=shell_exec($cmd);
return result;
我希望这对某人有所帮助。
http_code=400 错误请求。
尝试设置您的 header enctype='multipart/form-data',作为上传文件使用的表单。
CURLOPT_POST TRUE 执行常规 HTTP POST。这个POST是正常的application/x-www-form-urlencoded种,最常被HTML形式使用。
更多php.net
我可以使用以下命令在终端上使用 curl 上传文件:
curl https://upload.box.com/api/2.0/files/content \
> -H "Authorization: Bearer {access-code}" -X POST \
> -F attributes='{"name":"tested.png", "parent":{"id":"3804480350"}}' \
> -F file=@/Applications/MAMP/htdocs/BoxappTest/test.png
但是当我尝试使用 PHP 和以下代码执行相同操作时:
$filePath=realPath("./test.png");
$xmlfile = file_get_contents("codes.xml");
$codes_data = simplexml_load_string($xmlfile);
$access_token=$codes_data->access_code;
$destination_filename="tested.png";
$id="3804480350";
$ch= curl_init();
curl_reset($ch);
echo "Uploading file...",'<br>';
$post = '{"name":"'.$destination_filename.'", "parent":{"id":"'.$id.'"}}';
$postfields = Array("attributes"=>$post,"file" => "@".$filePath);
$headers= Array("Authorization: Bearer " . $access_token);
curl_setopt($ch, CURLOPT_URL, "https://upload.box.com/api/2.0/files/content");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$output=curl_exec($ch);
$info=curl_getinfo($ch);
curl_close($ch);
if(curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
}
foreach($info as $data => $part) {
echo $data."=".$part, '<br>';
}
echo "File uploaded...",'<br>';
var_dump($output);
它给我以下输出:
Uploading file...
content_type=text/html;charset=UTF-8
http_code=400
header_size=243
request_size=260
filetime=-1
ssl_verify_result=0
redirect_count=0
total_time=1.118914
namelookup_time=0.000738
connect_time=0.022878
pretransfer_time=0.100239
size_upload=335
size_download=0
speed_download=0
speed_upload=299
download_content_length=0
upload_content_length=335
starttransfer_time=1.10153
redirect_time=0
redirect_url=
primary_ip=74.112.185.182
certinfo=Array
primary_port=443
local_ip=10.0.0.188
local_port=50008
request_header=POST /api/2.0/files/content HTTP/1.1 Host: upload.box.com Accept: */* Authorization: Bearer {access-code} Content-Length: 335 Expect: 100-continue Content-Type: multipart/form-data; boundary=------------------------....
File uploaded...
string(0) ""
我浏览了各种网站,但其中 none 似乎适合我的问题。无论我做什么,content_type 都会保持 'text/html'。我试图在 header 和 post 字段中设置它。但是两者都没有用。我知道我正在正确获取访问代码并且它们是有效的。我不确定 curl 选项。设置 CURLOPT_VERBOSE 或检查错误也不会 return 任何东西。如果没有 CURLOPT_RETURNTRANSFER 选项,curl_exec return 是正确的。有人可以帮助我了解我在哪里犯了错误吗?
我无法使用 php 本身解决此问题,但使用 shell_exec() 到 运行 完整形式的 curl 命令确实有效。所以我坚持那个实现。
$cmd = "curl https://upload.box.com/api/2.0/files/content \
-H \"Authorization: Bearer $access_token\" -X POST \
-F attributes='{\"name\":\"$dest_name\",\"parent\": {\"id\":\"$parent_id\"}}' \
-F file=@\"$filePath\"";
$result=shell_exec($cmd);
return result;
我希望这对某人有所帮助。
http_code=400 错误请求。
尝试设置您的 header enctype='multipart/form-data',作为上传文件使用的表单。
CURLOPT_POST TRUE 执行常规 HTTP POST。这个POST是正常的application/x-www-form-urlencoded种,最常被HTML形式使用。
更多php.net