Загрузка объекта из корзины

Я пытаюсь написать функцию для загрузки файла, хранящегося в постоянном ведре, и у меня возникают проблемы с декодированием результата.

Я следую руководству здесь, чтобы попытаться загрузить показанный здесь объект:

(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.

Любые идеи о том, что я делаю неправильно, были бы замечательными.

Спасибо


person Kev Wilson    schedule 26.09.2016    source источник


Ответы (1)


BucketKey должен соответствовать этому регулярному выражению '^[-_.a-z0-9]{3,128}$', а objectKey должен быть закодирован в URL. Однако ключи, используемые для загрузки файла/объекта, должны совпадать с ключами, используемыми для загрузки. Это означает, что если вы решите кодировать символы одним способом, они должны быть закодированы таким же образом позже.

Я также заметил, что вы не указали, как кодировать загрузку. Если вы не укажете загрузку в виде октета, HTTP будет использовать значение по умолчанию, которое представляет собой текстовые символы UTF8 вместо двоичных. Вы указали CURLOPT_RETURNTRANSFER, который будет преобразован в двоичный, но вам не хватает заголовка для серверной части.

Приведенный ниже код отлично работает для меня, если предположить, что BucketKey и objectKey были URL-адресами, закодированными с помощью 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. Ответ содержит как заголовки, так и тело, поэтому вам нужно разделить его на свою сторону.

Надеюсь, это поможет,

person cyrille    schedule 26.09.2016
comment
Спасибо за вашу помощь @cyrille, но мне все еще не везет. Я заметил, что вы не расшифровали свой $http_body, я полагаю, это потому, что вы использовали octet-stream. Я установил "Accept: application/octet-stream" в своих заголовках, но curl_getinfo($ch) показывает, что 'content_type' => 'application/x-www-form-urlencoded', было отправлено. Может ли это быть причиной моей неспособности расшифровать ответ во что-то полезное? Я собираюсь отредактировать свой вопрос, чтобы включить ваши предложения. Спасибо - person Kev Wilson; 26.09.2016