2016-06-15 228 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); 
    } 
} 

,当我尝试POST请求。请求只是崩溃,不会返回任何东西(甚至是一个例外);

解决方案:

这个问题是通过以下方式解决。我使用了一种服务方法,以便能够上传一组文件。

Service Method to upload a collection of blobs

BlobHelper I类保存有关容器所需的信息,然后实例,它是一个static类。使用集合可以将多个文件作为同一个流的一部分进行上传。

+0

我想上传文件!通过获得它的路径。 – StefanL19

+0

可以请你分享你的工作代码片段的上述问题?谢谢。 – Sampath

+0

我会将其添加为该问题的扩展。 – StefanL19

回答

3

我认为你正在尝试使用标准的ASP.NET方法和本地上下文来获取上传到Blob存储的文件的路径。上传到blob的文件不会以这种方式访问​​。

好像你正确地上传你的blob。现在,如果你的文件上传成功,你的方法应该返回blockBlob.Uri.ToString(),它是你的文件的链接 - 你可以将它存储在数据库的某处或其他地方。

+0

是的,但问题是请求不是每个uri部分。当ReadAsMultipartAsync被执行时,它就会崩溃。 – StefanL19

+0

@ StefanL19我创建了[聊天室](https://chat.stackoverflow.com/rooms/114814/azurestorageissueupload) - 如果你有时间,让我们聊天,看看我们是否可以解决问题 –

相关问题