从 .Net MVC 6 将 CloudBlockBlob 作为可保存文件下载到浏览器
Download CloudBlockBlob as savable file to a browser from .Net MVC 6
我正在尝试为浏览器用户提供 select 列表中的文件并将文件下载回用户的能力。
我的 JavaScript 看起来像这样:
$scope.getFile = function (podUri, podName) {
$http.get('api/getDharmaPod', { params: { containerName: $scope.selectedContainer, podName: podName } })
.success(function (data, status, headers, config) {
$("#audio").text("Got file: ");
})
.error(function (data, status, headers, config) {
alert("got an error:" + status);
});
};
我还尝试了在 Whosebug
上找到的以下内容
$scope.getFile = function (podUri, podName) {
$http({
method: 'GET',
params: { containerName: $scope.selectedContainer, podName: podName },
cache: false,
url: 'api/getDharmaPod',
headers: {
'Content-Type': 'audio/mpeg; charset=utf-8'
}
}).success(function (data, status) {
console.log(status);
}).error(function (data, status) {
alert("got an error:" + status);
});
};
但结果是一样的:浏览器静静地接收服务器的传输并且不提供将其保存在任何地方。
我的 MVC 控制器方法如下所示:
[HttpGet, Route("api/getDharmaPod")]
public async Task<HttpResponse> GetDharmaPod(string containerName, string podName)
{
var dharmaBlob = AzureStorageAccess.GetBlob(containerName, podName);
MemoryStream memStream = new MemoryStream();
dharmaBlob.DownloadToStream(memStream);
Response.ContentType = "audio/mpeg";
await Response.SendAsync(memStream.ToArray());
return null;
}
我也试过:
[HttpGet, Route("api/getDharmaPod")]
public FileResult GetDharmaPod(string containerName, string podName)
{
var dharmaBlob = AzureStorageAccess.GetBlob(containerName, podName);
MemoryStream memStream = new MemoryStream();
dharmaBlob.DownloadToStream(memStream);
Response.ContentType = "audio/mpeg";
return File(memStream.ToArray(), "audio/mpeg", podName);
}
浏览器再次收到数据,但没有将其视为要存储的文件。它只是将它接收到一个变量中。我希望它能将其视为下载并将其保存到下载文件中。
我不确定是我发送有误还是接收有误,或者两者兼而有之:-(
感谢您的指导。
我决定走另一条路,因为我似乎找不到解决办法。
我的解决方案是使用 blob url 直接从容器中下载文件。我通过在我的控制器中生成一个共享访问密钥来使它有点安全,如下所示:
public static string GetSharedAccessKey(string containerName)
{
CloudStorageAccount storageAccount = GetAccount(_useDev);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
SharedAccessBlobPolicy blobPolicy = new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
};
return container.GetSharedAccessSignature(blobPolicy);
}
此 returns 可以附加到允许访问一小时的 blob 文件的 'a' 标记的 href link 的访问密钥。
我现在正在获取浏览器按预期存储在下载目录中的文件。
允许直接访问存储帐户的结果对于服务器端应用程序也更有效。
我正在尝试为浏览器用户提供 select 列表中的文件并将文件下载回用户的能力。
我的 JavaScript 看起来像这样:
$scope.getFile = function (podUri, podName) {
$http.get('api/getDharmaPod', { params: { containerName: $scope.selectedContainer, podName: podName } })
.success(function (data, status, headers, config) {
$("#audio").text("Got file: ");
})
.error(function (data, status, headers, config) {
alert("got an error:" + status);
});
};
我还尝试了在 Whosebug
上找到的以下内容$scope.getFile = function (podUri, podName) {
$http({
method: 'GET',
params: { containerName: $scope.selectedContainer, podName: podName },
cache: false,
url: 'api/getDharmaPod',
headers: {
'Content-Type': 'audio/mpeg; charset=utf-8'
}
}).success(function (data, status) {
console.log(status);
}).error(function (data, status) {
alert("got an error:" + status);
});
};
但结果是一样的:浏览器静静地接收服务器的传输并且不提供将其保存在任何地方。
我的 MVC 控制器方法如下所示:
[HttpGet, Route("api/getDharmaPod")]
public async Task<HttpResponse> GetDharmaPod(string containerName, string podName)
{
var dharmaBlob = AzureStorageAccess.GetBlob(containerName, podName);
MemoryStream memStream = new MemoryStream();
dharmaBlob.DownloadToStream(memStream);
Response.ContentType = "audio/mpeg";
await Response.SendAsync(memStream.ToArray());
return null;
}
我也试过:
[HttpGet, Route("api/getDharmaPod")]
public FileResult GetDharmaPod(string containerName, string podName)
{
var dharmaBlob = AzureStorageAccess.GetBlob(containerName, podName);
MemoryStream memStream = new MemoryStream();
dharmaBlob.DownloadToStream(memStream);
Response.ContentType = "audio/mpeg";
return File(memStream.ToArray(), "audio/mpeg", podName);
}
浏览器再次收到数据,但没有将其视为要存储的文件。它只是将它接收到一个变量中。我希望它能将其视为下载并将其保存到下载文件中。
我不确定是我发送有误还是接收有误,或者两者兼而有之:-(
感谢您的指导。
我决定走另一条路,因为我似乎找不到解决办法。
我的解决方案是使用 blob url 直接从容器中下载文件。我通过在我的控制器中生成一个共享访问密钥来使它有点安全,如下所示:
public static string GetSharedAccessKey(string containerName)
{
CloudStorageAccount storageAccount = GetAccount(_useDev);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
SharedAccessBlobPolicy blobPolicy = new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
};
return container.GetSharedAccessSignature(blobPolicy);
}
此 returns 可以附加到允许访问一小时的 blob 文件的 'a' 标记的 href link 的访问密钥。
我现在正在获取浏览器按预期存储在下载目录中的文件。
允许直接访问存储帐户的结果对于服务器端应用程序也更有效。