2016-06-15 14 views
3

ファイルをAzure blobストレージに非同期でアップロードしたいと思います。私は、公式SDKで提案されている方法を試してみました:ファイルをAzure Blobストレージにアップロードする

これは私がコンテナを取得する方法である:

public static class BlobHelper 
{ 
    public static CloudBlobContainer GetBlobContainer() 
    { 
     // Pull these from config 
     var blobStorageConnectionString = ConfigurationManager.AppSettings["BlobStorageConnectionString"]; 
     var blobStorageContainerName = ConfigurationManager.AppSettings["BlobStorageContainerName"]; 

     // Create blob client and return reference to the container 
     var blobStorageAccount = CloudStorageAccount.Parse(blobStorageConnectionString); 
     var blobClient = blobStorageAccount.CreateCloudBlobClient(); 
     var container = blobClient.GetContainerReference(blobStorageContainerName); 
     container.CreateIfNotExists(); 
     container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 
     return container; 
    } 
} 

そして、これは私がファイルをアップロードしようとする方法である:

var documentName = Guid.NewGuid().ToString(); 

CloudBlobContainer container = BlobHelper.GetBlobContainer(); 

CloudBlockBlob blockBlob = container.GetBlockBlobReference(documentName); 

public class FilesService 
{ 
    public async Task<string> UploadFiles(HttpContent httpContent) 
    { 

     var documentName = Guid.NewGuid().ToString(); 

     CloudBlobContainer container = BlobHelper.GetBlobContainer(); 

     CloudBlockBlob blockBlob = container.GetBlockBlobReference(documentName); 

     using (var fileStream = System.IO.File.OpenRead(@"path\myfile")) 
     { 
      await blockBlob.UploadFromStreamAsync(fileStream); 
     } 

     return blockBlob.Uri.ToString(); 
    } 
} 

問題ファイルへのパスを取得する方法がわからないということです(ユーザーがアップロードします)。

私はこれしようとすると:

var rootpath = HttpContext.Current.Server.MapPath("~/App_Data"); 

var streamProvider = new MultipartFileStreamProvider(rootpath); 

await httpContent.ReadAsMultipartAsync(streamProvider); 
foreach (var file in streamProvider.FileData) 
{ 
    var localName = file.LocalFileName; 
    using (var fileStream = System.IO.File.OpenRead(file.LocalFileName)) 
    { 
     await blockBlob.UploadFromStreamAsync(fileStream); 
    } 
} 

をそして私はポストの要求をしようとします。リクエストはクラッシュし、何も返されません(例外でさえも)。

ソリューション:

問題は次のように解決されました。私は、ファイルのコレクションをアップロードできるようにサービスメソッドを使用しました。私はコンテナに関する必要な情報を保存し、それをインスタンス化BlobHelperクラスで

Service Method to upload a collection of blobs

、それはstaticクラスです。コレクションを使用すると、複数のファイルを同じストリームの一部としてアップロードすることができます。

+0

ファイルをアップロードしようとしています。そのパスを取得する。 – StefanL19

+0

上記の問題のために作業コードスニペットを教えていただけますか?ありがとうございます。 – Sampath

+0

質問の延長として追加します。 – StefanL19

答えて

3

標準のASP.NETメソッドとローカルコンテキストを使用してBlobストレージにアップロードされているファイルへのパスを取得しようとしていると思います。ブロブにアップロードされたファイルはそのようにアクセスできません。

ブロブを正しくアップロードしているようです。これで、ファイルが正常にアップロードされた場合、メソッドはファイルへのリンクであるblockBlob.Uri.ToString()を返します。データベースのどこかに保存することができます。

+0

はい、問題はそれぞれのURI部分ではないということです。これは、ReadAsMultipartAsyncが実行される瞬間にクラッシュします。 – StefanL19

+0

@ StefanL19私は[チャットルーム](https://chat.stackoverflow.com/rooms/114814/azurestorageissueupload)を作成しました。時間があれば、チャットして問題を解決できるかどうか確認しましょう –

関連する問題