我可以成功上传到Azure Blob存储,但是在下载文件(csv和pdf文件)时遇到问题。
我的目标是将文件下载到浏览器(因为这将是一个Web应用程序,并且我不知道将文件下载到的本地路径)。
string connString = ConfigurationManager.ConnectionStrings["MyTestStorageAccount"].ConnectionString;
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(connString);
CloudBlobClient _blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer _cloudBlobContainer = _blobClient.GetContainerReference("filestorage");
CloudBlockBlob _blockBlob = _cloudBlobContainer.GetBlockBlobReference("testfile.csv");
Response.AddHeader("Content-Disposition", "attachment; filename=" + "testfile.csv");
_blockBlob.DownloadToStream(Response.OutputStream);
答案 0 :(得分:0)
我已经测试了您的代码,效果很好。您可以告诉我们您的问题,例如错误消息,更详细的要求等。
我创建了一个通用处理程序(ashx)对其进行测试,这是经过测试的代码供您参考:
<%@ WebHandler Language="C#" Class="DownloadHandler" %>
using System.Web;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
public class DownloadHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=your_account;AccountKey=your_key;EndpointSuffix=core.windows.net");
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = cloudBlobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();
CloudBlockBlob blob = container.GetBlockBlobReference("4.PNG");
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + "4.PNG");
blob.DownloadToStream(context.Response.OutputStream);
}
public bool IsReusable {
get {
return false;
}
}
}
结果截图:
当我通过IE 11访问此处理程序时
答案 1 :(得分:0)
我在mvc中遵循您的代码并在我的网站上下载csv,当我打开它时,里面的内容不是我添加的内容,而是一些html模板。
如果这是您的问题,则可以参考以下代码:
public ActionResult Download()
{
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient _blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer _cloudBlobContainer = _blobClient.GetContainerReference("data");
CloudBlockBlob _blockBlob = _cloudBlobContainer.GetBlockBlobReference("table.csv");
Response.AddHeader("Content-Disposition", "attachment; filename=" + "table.csv");
MemoryStream ms = new MemoryStream();
_blockBlob.DownloadToStream(ms);
ms.Position = 0;
return File(ms, "application/octet-stream", "table.csv");
}
您还可以return Redirect(blobUrl);
顺便说一句,如果您的Blob是私有,则需要创建一个具有 Read 权限和Shared Access Signature
标头的Content-Disposition
并创建Blob URL基于该网址并使用该网址。在这种情况下,blob内容将直接从存储流传输到客户端浏览器。
有关更多details,请参考以下代码:
public ActionResult Download()
{
CloudStorageAccount account = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), true);
var blobClient = account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("container-name");
var blob = container.GetBlockBlobReference("file-name");
var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),//assuming the blob can be downloaded in 10 miinutes
}, new SharedAccessBlobHeaders()
{
ContentDisposition = "attachment; filename=file-name"
});
var blobUrl = string.Format("{0}{1}", blob.Uri, sasToken);
return Redirect(blobUrl);
}