1

Nous utilisons l'API V Cloud pour interagir avec les machines virtuelles (créer des machines, effectuer des actions, changer de support, etc.). Une fonction demandée est de pouvoir télécharger des médias (en particulier des ISO) vers un catalogue particulier. Le API guide (pg 67) est assez simple, et nos requêtes en plusieurs parties à l'URL qui est fournie lorsque le téléchargement démarre se déroulent sans accroc.Le téléchargement de médias via l'API VMware entraîne une taille transférée plus grande que la taille du fichier

Note: Nous devons déclarer la taille du fichier avant de lancer le téléchargement

La seule chose qui semble mal pendant le téléchargement lui-même est que la « taille transférée » finit par être plus grande que la « taille du fichier » à la fin du processus. C'est un peu étrange car notre gamme de contenu ne dépasse jamais la taille de fichier attendue (nous supposons que les méta-données sont incluses sans que nous ayons un mot à dire). Une fois cette taille transférée dépasse la taille du fichier, l'état des changements de téléchargement de fichiers à « erreur », mais retourne toujours un 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" 
} 

Je ne sais pas où commencer même débogage cela car tous les appels API reviennent avec 200 OK, le .ISO file semble être bon, nos en-têtes de gamme de contenu ne dépassent jamais la taille de fichier établie, et les méta-données semblent être hors de notre contrôle en termes d'édition ou de mesure.

Espérant une certaine âme a connu ce problème avant et peut donner un aperçu de travailler à une solution

Répondre

2

Il se trouve la question n'a pas été avec le vmware du tout, mais comment nous Chunking le fichier multimédia. Nous avons initialement utilisé FileReader() pour découper le fichier et l'envoyer à l'API VMware. Théoriquement, nous choisissions la taille de bloc et nous pouvions générer et définir la plage de contenu, mais en réalité nous choisissions la plage de contenu mais la longueur de contenu était différente de la taille de bloc. Nous ne sommes toujours pas tout à fait sûr de savoir pourquoi cela est arrivé (peut-être que des méta-données supplémentaires ont été ajoutées), mais nous avons trouvé une solution.

Le correctif: Nous avons éliminé FileReader() tout à fait et vient de mettre les tranches de fichiers directement dans un blob (vous pouvez voir ci-dessous)

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

     } 

Cela nous a permis de effectivement contrôler la longueur du contenu, et puisque nous pouvons identifier quand le nombre d'octets transférés est égal à la taille de fichier nous pourrions alors compléter le processus.