autodesk-forge - 以node.js 斷點續傳將模型上傳到Autodesk Forge,但api無回應?
巴扎黑
巴扎黑 2017-04-17 16:24:17
0
1
398

以下code測試,api沒有回應說目前上傳到那段,就直接timeout。再麻煩檢視程序是否有誤。謝謝!

function _uploadChunk(fileName, filePath, oAuth2TwoLegged, credentials, progressCallback) {

return new Promise((resolve, reject) => {
    let objectApi = new ForgeSDK.ObjectsApi()
    let fileState = fs.statSync(filePath)
    let fileSize = fileState.size
    let chunkSize = 2 * 1024 * 1024
    let nbChunks = Math.round(0.5 + fileSize / chunkSize)
    let sessionID = 'testviotv4054irt'// + Math.floor(Date.now() / 1000)

    for (let index = 0; index < nbChunks; index++) {
        let start = index * chunkSize
        let end = Math.min(fileSize, (index + 1) * chunkSize) - 1
        let contentRange = 'bytes ' + start + '-' + end + '/' + fileSize
        let readStream = fs.createReadStream(filePath, { start: start, end: end })
        objectApi.uploadChunk(config.defaultBucketKey, fileName, fileSize, contentRange, sessionID, readStream, {}, oAuth2TwoLegged, credentials)
            .then(object => {
                if (object.statusCode == 202) {
                    progressCallback(object.body)
                } else if (object.statusCode == 202) {
                    resolve(object.body)
                }
            }).catch(err => {
                resolve(err)
            })
    }
})

}

巴扎黑
巴扎黑

全部回覆(1)
PHPzhong

首先,你的程式碼uploadChunk用到fileSize,這是整個檔案的大小,而不是某一次分塊的大小。另外,需要有一個object.statusCode == 200的狀態,這是最後一個分塊成功後的狀態。

我不太熟悉ES6,所以按照常規JS寫寫了一段函數,基於Forge Node.js SDK中的測試腳本, 可以替換掉line 155的uploadFile進行測試。

//随机字串,形成session id
function randomString(length, chars) {
    var result = '';
    for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
    return result;
}

//分块上载

var resumableUploadFile = function(bucketKey, filePath, fileName){
    console.log("**** Resumable Uploading file. bucket:"+ bucketKey + " filePath:"+filePath);
    return new Promise(function(resolve, reject) {

         fs.stat(fileName, function (err, stats) {

                if (err) {
                    reject(err);
                    return;
                }

                var fileSize = stats.size ;
                 var chunkSize = CHUNK_SIZE * 1024 * 1024 ;
                 var nbChunks = Math.round (0.5 + fileSize / chunkSize) ;
                 var rString = randomString(32,     '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

                 var sessionID = 'forge-xiaodong-test-' + rString;

                  function unitPromise(n, chunkSize) {

                     return new Promise(function(resolve, reject){
                            var start = index * chunkSize;
                        var end = Math.min(fileSize, (index + 1) * chunkSize) - 1;
                        var contentRange = 'bytes ' + start + '-' + end + '/' + fileSize;
                        var length = end - start + 1;
                            console.log("**** 分块上载:"+ start + 
                            " end:"+end );


                            var readStream = fs.createReadStream(filePath+fileName, { start: start, end: end });
                        objectsApi.uploadChunk(bucketKey, 
                                            fileName, 
                                            length, 
                                            contentRange,
                                             sessionID, 
                                             readStream, {}, 
                                             oAuth2TwoLegged, 
                                             oAuth2TwoLegged.getCredentials())
                        .then(
                            function(res){
                                if(res.statusCode == 202)
                                {
                                    console.log("*********分块上载成功!");
                                    //continue the next chunk
                                    resolve(res);

                                }
                                else if(res.statusCode == 200)
                                {
                                    //last chunk
                                    console.log("********最后一块上载成功!");
                                    resolve(res);
                                }
                            },function(err){
                                console.log("*********此分块上载失败!"+err.statusCode);

                                reject(err);
                            }
                        );
                     });
                  }//unit promise function

                var uploadpromises = [];

                for( var index=0;index<nbChunks;index++)
                 {
                    uploadpromises.push(unitPromise(index,chunkSize));
                 }

                 Promise.all(uploadpromises)    
                     .then(function(data){resolve(data); })
                     .catch(function(err){ reject(err);}); 
         });
    });
  
};
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!