0

Autodesk の Forge Object Storage Service を使用しています。ファイルをバケットにアップロードできますが、ダウンロードしようとすると、本文が空になります。ただし、 を使用するHead場合、Data-Size は正しいです。

これが私のアップロードです(署名付きURLアップロードAPIを使用していることに注意してください):

            var url = uploadOptions.url;

            var fileReader = new FileReader();
            // UploadOptions.Body contains a Blob
            fileReader.readAsBinaryString(uploadOptions.Body);
            fileReader.onloadend = function (e) {
                var xhr = new XMLHttpRequest();
                var lastLoadedValue = 0;
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 201)) {
                        console.log('UPLOAD FINISHED:', xhr.responseText);
                        callback();
                    }
                };
                xhr.open("PUT", url, true);
                xhr.withCredentials = true;
                // uploadOptions.ContentType = 'application/octet-stream'
                xhr.setRequestHeader('Content-Type', uploadOptions.ContentType);
                xhr.send(e.target.result);

ここに私のダウンロードがあります:

         スーパーエージェント
            .get(_autodesk_api_baseurl
                + baseUrl
                + downloadOptions.bucket
                + '/オブジェクト/'
                + encodeURIComponent(downloadOptions.key))
            .set('認証', 'ベアラー'
                + token.access_token)
            .query({'応答コンテンツ タイプ': 'アプリケーション/オクテット ストリーム'})
            .end(関数 (エラー、応答) {
                if (typeof callback === '関数') {
                    // すべて正常に動作します
                    コールバック(未定義、応答);
                }
            });

そして、コールバックで応答を出力すると、本文は空になります。これを取得するために、JSON エンコードされた応答をファイルに書きました。

{
"req": {
    "method": "GET",
    "url": "https://developer.api.autodesk.com/oss/v2/buckets/storage.vcs.prod.mevsg.autodesk.com/objects/assets%2FNT5NR9KJU2PH%2Fea02ec77505f2ea2defac93fe231764f2916e4d1aeaac7d92945a08a0086c60667369431361d5aa426d4cccca49b9e4c7cb70bc6ebf700258a3cb37617eacfa0"
},
"header": {
    "access-control-allow-credentials": "true",
    "access-control-allow-headers": "Authorization, Accept-Encoding, Range, Content-Type",
    "access-control-allow-methods": "GET",
    "access-control-allow-origin": "*",
    "content-disposition": "attachment; filename=\"ea02ec77505f2ea2defac93fe231764f2916e4d1aeaac7d92945a08a0086c60667369431361d5aa426d4cccca49b9e4c7cb70bc6ebf700258a3cb37617eacfa0\"",
    "content-encoding": "gzip",
    "content-type": "application/octet-stream",
    "date": "Thu, 30 Jun 2016 18:03:10 GMT",
    "etag": "\"8ad9c59b256cef48798a94c0295023088016d43a\"",
    "server": "Apigee Router",
    "vary": "Accept-Encoding",
    "transfer-encoding": "chunked",
    "connection": "Close"
},
"status": 200

}

ご覧のとおり、本体はありません。しかしHead、オブジェクトで使用すると、適切なバイト数が得られます。

誰かが私が間違っていることを教えてもらえますか? Content-Type をハードコーディングしてみapplication/x-www-form-urlencodedたら、ファイルをダウンロードできましたが (本文にバイトがありました)、バイトが少し変更されました。たとえば、208 (11010000) は 80 (1010000) になりました。ご覧のとおり、最初のビットが反転しています。そのコンテンツ タイプでは、ファイルを開くことができませんでした。どの方法を使用すればよいですか?


更新: Augusto の助けを借りて、問題を発見しました。

  1. Superagent は機能しないようですが、Request は機能します。
  2. 実際に影響があったかどうかはわかりませんが、ダウンロードしたバッファのエンコーディングをbase64に設定しました
  3. Blob を直接アップロードする必要がありました。バイトを読み取るために FileReader を使用する必要はありませんでした。
4

3 に答える 3

1

問題を解決したのは次のとおりです。

アップロードには、Blob のみを送信する必要がありました。更新されたコードは次のとおりです。

    var url = uploadOptions.url;

    var xhr = 新しい XMLHttpRequest();

    xhr.onreadystatechange = 関数 () {
        if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 201)) {
            console.log(xhr.status);
            console.log('アップロード完了:', xhr.responseText);
            折り返し電話();
        }
    };

    xhr.open("PUT", URL, true);
    xhr.withCredentials = true;
    // Blob を直接送信!!
    xhr.setRequestHeader('Content-Type', uploadOptions.ContentType);
    xhr.send(アップロードオプション.ボディ);

ダウンロードでは、ライブラリ Superagent は機能しませんでしたが、Request は機能しました。また、バッファのエンコーディングを base64 に変更しました。コードは次のとおりです。

    リクエスト({
        URL: _autodesk_api_baseurl
            + baseUrl
            + downloadOptions.bucket
            + '/オブジェクト/'
            + encodeURIComponent(downloadOptions.key),
        メソッド: "GET",
        ヘッダー: {
            「認可」: 「ベアラー」 + token.access_token
        }、
        エンコーディング: null
    }, 関数 (エラー、応答、本文) {
        //ここでエラー処理

        if (typeof callback === '関数') {
            callback(null, new Buffer(body, 'base64'));
        }
    });

その後、バッファをファイルに書き込んで開くことができます。答えてくれた人に感謝します。

于 2016-07-13T14:53:53.940 に答える
0

ファイルをダウンロードするために content-type が必要だとは思わないでください。詳細については、こちらを参照してくださいファイルの詳細をリクエストできますか?

これは動作するはずのそれをダウンロードするためのカールです:

curl -v "https://developer.api.autodesk.com/oss/v2/buckets/storage.vcs.prod.mevsg.autodesk.com/objects/assets%2FNT5NR9KJU2PH%2Fea02ec77505f2ea2defac93fe231764f2916e4d1aeaac7d92945a08a0086c60667369431361d5aa426d4cccca49b9e4c7cb70bc6ebf700258a3cb37617eacfa0"
  -X GET
  -H "Authorization: Bearer AbCdEfGhIjKlMnOpQrStUvXwYz"

NodeJS/Request モジュールで使用したコードを次に示します。これは実際には非常に一般的ですが、/oss/ URL リソースを渡すと問題なく動作します。どのライブラリを使用しているかわかりません。申し訳ありません。

function download(resource, token, onsuccess) {
    console.log('Downloading ' + config.baseURL + resource); // debug
    request({
        url: config.baseURL + resource,
        method: "GET",
        headers: {
            'Authorization': 'Bearer ' + token,
        },
        encoding: null
    }, function (error, response, body) {
        onsuccess(new Buffer(body, 'base64'));
    });
}
于 2016-06-30T18:39:58.667 に答える
0

このセクションは正しくないようです:

.query({'response-content-type': 'application/octet-stream'})

そのはず

.set('response-content-type', 'application/octet-stream')

とにかく、Augusto は正しいです。Authorization 以外のヘッダーを追加する必要はありません。

于 2016-06-30T19:07:03.057 に答える