将文件上载到Azure Blob存储

时间:2016-06-15 17:33:23

标签: c# azure azure-storage-blobs

我想异步上传文件到Azure blob存储。我试过官方sdk建议的方式:

这就是我获取容器的方式:

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

当我尝试发帖请求时。请求崩溃并且不返回任何内容(甚至是异常);

解决方案:

该问题以下列方式解决。我使用了一种服务方法,以便能够上传一组文件。

Service Method to upload a collection of blobs

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

1 个答案:

答案 0 :(得分:3)

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

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