2017-07-19 10 views
1

Azureファイルストレージにファイルを格納するカスタムMultipartStreamProviderをLiftの一部として作成します。&従来のアプリケーションのシフト作業。クライアントはフロントエンドでAngularJSを、バックエンドでWebAPIを使用しています。 MultipartStreamProviderを使用しようとしているとき、GetStreamを実装して、書き込むためのストリームを返す必要があります。私はそれに書き込まれるストリーム/ファイルのサイズを求めるcloudFile.OpenWriteを使用しています。ただし、GetStreamでは、ContentDisposition.Sizeは空です。 AngularJSに各ファイルまたはバックエンドのコンテンツサイズを送信させる方法がありますか?ファイルストリームのサイズをどこか別の場所から調べることはできますか?どんな助けでも大歓迎です。ありがとう!アズールへMultipartStreamProviderでファイルサイズを取得する方法ContentDispositionから見つからない場合のGetStream

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.."); 
    } 

実際の呼び出し

 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はアップロードコード

 /********************************** 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 

     }); 

答えて

0
ファイル

私は手動でヘッダに

 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 

     }); 

をファイルサイズを追加巻き上げそしてコンストラクタで、私は、ルックアップテーブルを作成するためにそれを使用:

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])); 
     } 
    } 

その後のルックアップのうち、ファイルのサイズをつかみます私のGetWriteStreamメソッドに渡します。

  var azureStream = _fileFacade.GetWriteStream(_uploadedFilesLookup[fileName], 
       _relativeDirectory, fileData.FileName, out newFileName); 
関連する問題