2017-07-19 2 views
1

Je crée un MultiPartStreamProvider personnalisé pour stocker des fichiers dans Azure File Storage dans le cadre d'une opération de transfert & Shift d'une application héritée. Le client utilise AngularJS sur le frontal et WebAPI sur le backend. Lorsque j'essaie d'utiliser MultipartStreamProvider, je dois implémenter GetStream pour renvoyer un flux dans lequel écrire. J'utilise cloudFile.OpenWrite qui demande la taille du flux/fichier qui sera écrit dessus. Cependant, dans GetStream, ContentDisposition.Size est vide. Est-ce que je peux soit faire en sorte que AngularJS envoie la taille de contenu pour chaque fichier ou sur le backend, peut-être que je peux creuser la taille du flux de fichier d'ailleurs? Toute aide serait grandement appréciée. Merci!Comment obtenir la taille de fichier dans MultipartStreamProvider GetStream lorsqu'il est manquant dans ContentDisposition

MultipartStreamProvider

 public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
     // For form data, Content-Disposition header is a requirement 
     ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition; 

     Console.WriteLine(files.Count); 
     if (contentDisposition != null) 
     { 
      // create default filename if its missing 
      contentDisposition.FileName = (String.IsNullOrEmpty(contentDisposition.FileName) ? $"{Guid.NewGuid()}.data" : contentDisposition.FileName); 

      // We won't post process files as form data 
      _isFormData.Add(false); 

      CloudMultipartFileData fileData = new CloudMultipartFileData(headers, _fileRepository.BaseUrl, contentDisposition.FileName);// your - aws - filelocation - url - maybe); 
      _fileData.Add(fileData); 

      var azureStream = _fileRepository.GetWriteStream(contentDisposition.Size, _relativeDirectory, fileData.FileName); 

      return azureStream; 

      // We will post process this as form data 
      _isFormData.Add(true); 
     } 

     throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part.."); 
    } 

appel réel à Azure

 public override Stream GetWriteStream(long? fileSize, string relativeDirectory, string filename) 
    { 
     var combinedRelativeDirectory = GetCloudDirectory(relativeDirectory); 
     CloudFile cloudFile = combinedRelativeDirectory.GetFileReference(filename); 
     return cloudFile.OpenWrite(fileSize, null, null); 
    } 

AngularJS File Upload code

 /********************************** Add/Upload Photos **************************************/ 
    $scope.$watch('files', function (files) { 
     $scope.formUpload = false; 
     console.log(files); 
     if (files != null) { 
      for (var i = 0; i < files.length; i++) { 
       $scope.errorMsg = null; 
       (function (file) { 
        upload(file); 
       })(files[i]); 
      } 
     } 
    }); 

    function upload(file) { 
     file.upload = Upload.upload({ 
      url: window.location.origin + "/api/mydocs/uploadfile?storeFolder=" + $scope.attachmentFolder + "&storeId=" + $scope.storeId + "&userId=" + $scope.currentUser.UserId, 
      method: 'POST', 
      headers: {}, 
      fields: {}, 
      file: file 

     }); 

Répondre

0

je liquidée ajouter manuellement la taille du fichier à l'en-tête

 function upload(file) { 
     file.upload = Upload.upload({ 
      url: window.location.origin + "/api/mydocs/uploadfile?storeFolder=" + $scope.myFolder + "&clientId=" + $scope.clientId, 
      method: 'POST', 
      headers: { 'file-info':file.name + "-/" + file.size }, 
      fields: {}, 
      file: file 

     }); 

Et puis dans le constructeur, je l'utiliser pour créer une table de recherche:

public MyCloudMultipartFormDataStreamProvider(string relativeDirectory, IEnumerable<string> lookupInfo) 
    { 
     NewFileNames = new Dictionary<string, string>(); 

     _fileRepository = new CloudFileRepository(); 
     _relativeDirectory = relativeDirectory; 
     _uploadedFilesLookup = new Dictionary<string, long>(); 
     foreach (var fileInfo in lookupInfo) 
     { 
      var values = Regex.Split(fileInfo, @"-/"); 
      _uploadedFilesLookup.Add(values[0], Int64.Parse(values[1])); 
     } 
    } 

attraper ensuite la taille du fichier de la recherche table et transmettre cela à ma méthode GetWriteStream

  var azureStream = _fileFacade.GetWriteStream(_uploadedFilesLookup[fileName], 
       _relativeDirectory, fileData.FileName, out newFileName);