1

Wir verwenden die V Cloud API zur Interaktion mit virtuellen Maschinen (Erstellen von Computern, Ausführen von Aktionen, Wechseln von Medien usw.). Eine angefragte Funktion besteht darin, Medien (insbesondere ISOs) in einen bestimmten Katalog hochladen zu können. Die API guide (pg 67) ist ziemlich einfach, und unsere mehrteiligen Anfragen an die URL, die beim Hochladen bereitgestellt wird, gehen ohne Probleme aus.Upload von Medien über VMware API führt zu größerer Größe als Dateigröße

Hinweis: Wir haben die Dateigröße zu erklären, bevor das Hochladen

Das einzige, was ausgehend, die während der Upload selbst ist nicht in Ordnung scheint, dass die „übertragen Größe“ endet als größer als die „Dateigröße“ am Ende des Prozesses. Das ist etwas seltsam, weil unser Content-Bereich niemals die erwartete Dateigröße überschreitet (wir gehen davon aus, dass die Metadaten enthalten sind, ohne dass wir ein Mitspracherecht haben). Sobald diese übertragen Größe die Dateigröße überschreitet, wird der Status der Datei-Upload-Änderungen „Error“, aber immer noch gibt ein 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" 
} 

nicht sicher, wo auch das Debuggen zu starten, da alle API-Aufrufe wieder mit 200 OK, Die .ISO file scheint in Ordnung zu sein, unsere Content-Range-Header gehen nie außerhalb der etablierten Dateigröße, und die Metadaten scheinen nicht in unserer Kontrolle zu sein, was das Editieren oder Messen betrifft.

der Hoffnung, einige Seele dieses Problem erlebt hat, vor und einen Einblick in die Arbeit an einer Lösung zur Verfügung stellen kann

Antwort

2

Es stellt sich heraus das Problem überhaupt nicht mit dem vmware war, sondern wie wir die Mediendatei wurden Chunking up. Wir haben anfangs FileReader() verwendet, um die Datei zu zerhacken und sie an die VMware API zu senden.

Theoretisch wählten wir die Chunk-Größe und konnten dann den Inhaltsbereich generieren und festlegen, aber in Wirklichkeit wählten wir den Inhaltsbereich, aber die Inhaltslänge war anders als die Chunk-Größe. Wir sind uns immer noch nicht ganz sicher, warum das passiert ist (vielleicht wurden zusätzliche Metadaten hinzugefügt), aber wir haben eine Lösung gefunden.

Das Update: Wir eliminiert Filereader() zusammen und legen Sie einfach die Datei Scheiben direkt in einen Klecks

$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) 
     } 

     } 

Doing so konnten wir tatsächlich steuern, um die Content-Length (Sie können weiter unten), und da wir feststellen können, wann die Anzahl der übertragenen Bytes gleich der Dateigröße ist, könnten wir den Vorgang abschließen.

Verwandte Themen