将文件上传到 Azure Blob 存储
Upload a file to Azure Blob Storage
我想将文件异步上传到 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);
}
}
当我尝试 post 请求时。该请求只是崩溃并且没有 return 任何东西(甚至是异常);
解法:
问题已通过以下方式解决。我使用了一种服务方法,以便能够上传一组文件。
在BlobHelper
class里面我保存了容器需要的信息然后实例化,是一个static
class。使用集合可以将多个文件作为同一流的一部分上传。
我认为您正在尝试使用标准 ASP.NET 方法和本地上下文获取正在上传到 Blob 存储的文件的路径。上传到 blob 的文件将无法通过这种方式访问。
您似乎正确上传了 blob。现在,如果您的文件上传成功,您的方法应该 return blockBlob.Uri.ToString(),这是您文件的 link - 您可以将它存储在数据库中的某个地方或其他任何地方。
我想将文件异步上传到 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);
}
}
当我尝试 post 请求时。该请求只是崩溃并且没有 return 任何东西(甚至是异常);
解法:
问题已通过以下方式解决。我使用了一种服务方法,以便能够上传一组文件。
在BlobHelper
class里面我保存了容器需要的信息然后实例化,是一个static
class。使用集合可以将多个文件作为同一流的一部分上传。
我认为您正在尝试使用标准 ASP.NET 方法和本地上下文获取正在上传到 Blob 存储的文件的路径。上传到 blob 的文件将无法通过这种方式访问。
您似乎正确上传了 blob。现在,如果您的文件上传成功,您的方法应该 return blockBlob.Uri.ToString(),这是您文件的 link - 您可以将它存储在数据库中的某个地方或其他任何地方。