首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从桶中下载对象

从桶中下载对象
EN

Stack Overflow用户
提问于 2016-09-26 10:42:23
回答 1查看 347关注 0票数 0

我正试图编写一个函数来下载存储在持久性桶中的文件,并且在解码结果时遇到了一些问题。

我正在按照指南这里尝试并下载这里显示的对象:

代码语言:javascript
复制
(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函数

代码语言:javascript
复制
    $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);看起来一切都很好:

代码语言:javascript
复制
'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桶中获得一个文件。

任何关于我做错了什么的想法都会很棒。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-26 12:22:49

bucketKey应该匹配这个正则表达式'^-_.a-z0-9{3,128}$',并且objectKey应该被编码。但是,用于上载文件/对象的密钥必须与用于下载的键匹配。这意味着,如果您选择以一种方式对字符进行编码,则以后应该以相同的方式对它们进行编码。

我还注意到您没有指定如何对下载进行编码。如果您没有指定下载为八进制,HTTP将使用默认的UTF8文本字符和二进制字符。您确实指定了将转换为二进制的CURLOPT_RETURNTRANSFER,但是您缺少了服务器部分的头。

下面的代码对我来说很好,假设bucketKey和objectKey是用rawurlencode()编码的,以及文件/对象是用PUT上传的。

代码语言:javascript
复制

$ch =curl_init ();

$headers =[

代码语言:javascript
复制
"Authorization: Bearer {$token->token}",
代码语言:javascript
复制
"Accept: application/octet-stream",
代码语言:javascript
复制
"Content-Type: application/json"

];

$url ="https://developer.api.autodesk.com/oss/v2/buckets/{$bucket_key}/objects/{$object_key}“;

curl_setopt_array($ch,[

代码语言:javascript
复制
CURLOPT_HTTPHEADER => $headers,
代码语言:javascript
复制
CURLOPT_RETURNTRANSFER => 1,
代码语言:javascript
复制
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);

代码语言:javascript
复制

如您所见,我将响应分为两部分。标题和八进制流。文件下载在第二部分,是HTTP响应。响应包含头和正文,因此您需要将其分割到您的端。

希望能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39700723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档