从 .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 的访问密钥。

我现在正在获取浏览器按预期存储在下载目录中的文件。

允许直接访问存储帐户的结果对于服务器端应用程序也更有效。