2016-09-26 5 views
0

永続バケットに格納されたファイルをダウンロードする関数を作成しようとしていますが、結果をデコードする際に問題が発生しています。バケットからオブジェクトをダウンロードする

私はここに示されているオブジェクトを試してみて、ダウンロードするためのガイド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' 
    } 

$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);次のcURL関数を使うにはなります

'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

はbucketKeyこの正規表現 '^ [-_。-Z0-9] {3,128} $' と一致する必要があり、そしてobjectKeyは、符号化されたURLであるべきです。ただし、ファイル/オブジェクトのアップロードに使用するキーは、ダウンロードに使用したキーと一致する必要があります。つまり、文字を一方向にエンコードすることを選択した場合、後で同様にエンコードする必要があります。

ダウンロードのエンコード方法を指定していないことに気付きました。あなたが八重奏としてダウンロードするように指定しなければ、HTTPはUTF8のテキスト文字対バイナリを使用します。バイナリに変換するCURLOPT_RETURNTRANSFERを指定しましたが、サーバー部分のヘッダーがありません。

bucketKeyとobjectKeyがrawurlencode()でエンコードされていると仮定すると、以下のコードはうまく動作します。 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) ; 

`` `

私は2つの部分に応答を分割見ることができるように。ヘッダーとオクテットストリーム。ファイルのダウンロードは2番目の部分にあり、HTTP本体の応答です。応答にはヘッダーと本文の両方が含まれているため、これを最後に分割する必要があります。

希望のある方は、

+0

助けてくれてありがとうございました。しかし、私はまだ多くの運がありません。 '$ http_body'をデコードしなかったことに気付きました。これはあなたが'オクテットストリーム 'を使ったからだと思います。私はヘッダーに '' Accept:application/octet-stream ''を設定しましたが、 '' content_type '=>' application/x-www-form-urlencoded '、 'が送られたことを' curl_getinfo($ ch) 'は示しています。これが応答を何か有用なものにデコードできないという背後にある理由でしょうか?質問を編集してあなたの提案を含めるつもりです。ありがとう –

関連する問題