1

仮想マシンとのやりとり(マシンの作成、アクションの実行、メディアの切り替えなど)にV Cloud APIを利用しています。 1つの要求された機能は、メディア(特にISO)を特定のカタログにアップロードできることです。 API guide (pg 67)はかなり簡単で、アップロードが開始されたときに提供されるURLへのマルチパートリクエストは、問題なく停止します。VMware API経由でメディアをアップロードすると、ファイルサイズよりも転送サイズが大きくなる

注:アップロード自体中に気を悪く思わ我々は、アップロード

を開始する前に、ファイルのサイズを宣言する必要が唯一のものは、「転送サイズ」は、「ファイルサイズ」より大きくなってしまうということですプロセスの最後に私たちのcontent-rangeが予想されるファイルサイズを決して超えないので、これはやや奇妙です(私たちは、私たちが言うことなくメタデータが含まれていると仮定します)。この転送サイズは「エラー」に、ファイルアップロードの状態が変化し、ファイルサイズを超えているが、それでも、どこのすべてのAPI呼び出しが200 OKに戻ってくるので、これでもデバッグを開始するわからない200 OK

{ 
    "name": "J Small 4", 
    "description": "", 
    "files": [{ 
    "name": "file", 
    "totalSize": 50696192, 
    "status": "Error", 
    "link": "https://cloud01.cs2cloud.com/transfer/27b8f93c-8319-419e-9e8c-15622097670b/file", 
    "transferredSize": 54293177 
    }], 
    "id": "urn:vcloud:media:1cec68ef-f22e-4ec7-ae5d-dfbc4f7137d9", 
    "catalogId": "urn:vcloud:catalogitem:19dbfdd8-ea70-4355-abc7-96e34dccb869" 
} 

を返したら、 .ISO fileは問題ないと思われますが、私たちのコンテンツ範囲ヘッダーは決して確立されたファイルサイズの外に出ることはなく、メタデータは編集や測定の面でコントロールできません。

いくつかの魂が前にこの問題を経験しているし、それは問題が全くVMwareとではなかったが判明したソリューション

答えて

2

に向けた作業にいくつかの洞察を提供することができます願ってますが、どのように我々は、メディアファイルをチャンクました。最初にFileReader()を使用してファイルをチャンクアップし、VMware APIに送信しました。

理論的には、チャンクサイズを選択してコンテンツ範囲を生成して設定できましたが、実際にはコンテンツ範囲を選択していましたが、コンテンツ長はチャンクサイズとは異なりました。なぜそれが起こったのかまだ完全にはわかっていない(余分なメタデータが追加されているかもしれない)が、解決策が見つかった。

修正:私たちは)(FileReaderのを排除し、完全に、ちょうどブロブに直接ファイルのスライスを入れて(あなたは以下を参照することができます)

$scope.parseMediaFile = function(url, file, catalogId) { 
     $scope.uploadingMediaFile = true; 

     var fileSize = file.size; 
     var chunkSize = 1024 * 1024 * 5; // bytes 
     var offset = 0; 
     var self = this; // we need a reference to the current object 
     var chunkReaderBlock = null; 
     var chunkNum = 0; 

     if (fileSize < chunkSize) { 
      chunkSize = fileSize; 
     } 

     chunkReaderBlock = function(_offset, length, _file) { 
      var blob = _file.slice(_offset, length + _offset); 
      var beginRange = _offset; 
      var endRange = _offset + length; 

      if(endRange > _file.size) { 
       endRange = _file.size 
      } 

      var contentRange = beginRange + "-" + endRange; 

      vdcServices.uploadMediaFile(url, blob, fileSize, contentRange).then(
       function(resp) { 
       vdcServices.getUploadStatus($scope.company, catalogId).then(function(resp) { 
        var uploaded = resp.data.files[0].transferredSize; 
        $scope.mediaPercentLoaded = $scope.trunc((uploaded/fileSize) * 100); 

        if (endRange == _file.size) { 
        $scope.closeModal(); 
        return; 
        } 

        chunkReaderBlock(_offset+length, chunkSize, file); 
       }, function(err) { 
        $scope.errorMsg = err; 
        chunkReaderBlock(_offset-length, chunkSize, file); 
       }) 
       }, 
       function(err) { 
       $scope.errorMsg = err; 
       } 
      ) 
     } 

     // Starts the read with the first block 
     if (offset < fileSize) { 
      chunkReaderBlock(offset, chunkSize, file) 
     } 

     } 

そうは実際に私たちを許可されたコンテンツの長さを制御し、転送されたバイト数がファイルサイズと等しい時を特定できるので、プロセスを完了することができます。

関連する問題