我试图编写一个函数来下载存储在持久存储桶中的文件,但我在解码结果时遇到了一些问题。
我按照指南here尝试下载此处显示的对象:
(int) 3 => object(stdClass) {
bucketKey => 'my-persistent-bucket'
objectKey => '11--test.dwg'
objectId => 'urn:adsk.objects:os.object:my-persistent-bucket/11--test.dwg'
sha1 => '477085439a60779064d91fd1971d53c77c7a163a'
size => (int) 188600
location => 'https://developer.api.autodesk.com/oss/v2/buckets/my-persistent-bucket/objects/11--test.dwg'
}
使用以下cURL函数
$ch = curl_init();
$headers = [
"Authorization: Bearer " . $token->token,
"Accept: application/octet-stream"
];
$url = 'https://developer.api.autodesk.com/oss/v2/buckets/'.$this->persistent.'/objects/'.rawurlencode($file->object_key);
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url
]);
$response = curl_exec($ch) ;
$http_header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE) ;
$http_header = substr($response, 0, $http_header_size) ;
$http_body = substr($response, $http_header_size) ;
$response_info = curl_getinfo($ch) ;
curl_close($ch) ;
curl_getinfo($ch);
看起来一切都很顺利:
'url' => 'https://developer.api.autodesk.com/oss/v2/buckets/my-persistent-bucket/objects/11--test.dwg',
'content_type' => 'application/x-www-form-urlencoded',
'http_code' => (int) 200,
'header_size' => (int) 474,
'request_size' => (int) 199,
'filetime' => (int) -1,
'ssl_verify_result' => (int) 0,
'redirect_count' => (int) 0,
'total_time' => (float) 1.261261,
'namelookup_time' => (float) 0.029048,
'connect_time' => (float) 0.057444,
'pretransfer_time' => (float) 0.119675,
'size_upload' => (float) 0,
'size_download' => (float) 188600,
'speed_download' => (float) 149532,
'speed_upload' => (float) 0,
'download_content_length' => (float) 188600,
'upload_content_length' => (float) 0,
'starttransfer_time' => (float) 0.902231,
'redirect_time' => (float) 0,
'redirect_url' => '',
'primary_ip' => '52.210.137.76',
'certinfo' => [],
'primary_port' => (int) 443,
'local_ip' => '10.0.2.15',
'local_port' => (int) 50564
$http_body = '%C8B%BB%8B%A6%12%03Z%7D%29%E7%27%1F%5D%D4%CB%FC%DA%15G%3B%13%0D%89%0A%1C%DB%AE2%2C%9AP%EE%60x6%FD%92I2%F6%DE%7DI%DC%A0O%14%F2%84%9Ed%D0k%C40%B7%3E%3B%A1%22%...
响应总是看起来像是一个url编码的字符串,但无论我如何尝试解码它,我都无法获得工作文件,到目前为止我已经尝试过:
curl_unescape()
urldecode()
rawurldecode()
并且这些都没有给我一个可用的文件。值得注意的是,我可以从A360下载文件没问题,但是我还没有设法从Forge桶中获取一个文件。
关于我做错的任何想法都会很棒。
由于
答案 0 :(得分:0)
bucketKey应匹配此正则表达式'^ [-_.a-z0-9] {3,128} $',并且objectKey应该是URL编码的。但是,用于上载文件/对象的密钥必须与用于下载的密钥相匹配。这意味着如果您选择以一种方式对字符进行编码,则应在以后对它们进行相同的编码。
我还注意到你没有指定如何编码下载。如果未指定以八位字节的形式下载,HTTP将使用默认值,即UTF8文本字符与二进制文件。您确实指定了CURLOPT_RETURNTRANSFER,它将转换为二进制,但您缺少服务器部分的标题。
下面的代码对我来说很好,假设bucketKey和objectKey是使用rawurlencode()进行URL编码的;以及使用PUT上传文件/对象的时间。
```
$ch =curl_init () ;
$headers =[
"Authorization: Bearer {$token->token}",
"Accept: application/octet-stream",
"Content-Type: application/json"
] ;
$url ="https://developer.api.autodesk.com/oss/v2/buckets/{$bucket_key}/objects/{$object_key}" ;
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url
]) ;
$response =curl_exec ($ch) ;
$http_header_size =curl_getinfo ($curl, CURLINFO_HEADER_SIZE) ;
$http_header =substr ($response, 0, $http_header_size) ;
$http_body =substr ($response, $http_header_size) ;
$response_info =curl_getinfo ($ch) ;
curl_close ($ch) ;
file_put_contents ('11--test.dwg', $http_body) ;
```
如您所见,我将响应分为两部分。标题和八位字节流。文件下载位于第二部分,是HTTP正文响应。响应包含标题和正文,因此您需要将其拆分为最终结果。
希望有所帮助,