有没有办法强制将 Azure CDN 文件下载为浏览器附件
本文关键字:文件下载 浏览器 CDN Azure 有没有 | 更新日期: 2023-09-27 18:36:47
我们正在构建一个与DAM(数字资产管理)系统集成的 ASP.NET Web应用程序。DAM 将文件存储在 Azure blob 存储中,并使用 Azure CDN 公开提供这些文件。
我们将提供这些文件(大多数是PDF)可以从我们的网络应用程序下载。当用户请求其中一个文件时,我们将提供一个自定义URL,该URL将在服务器上运行一些代码(记录下载等),然后再返回相关文件进行下载。
客户端要求文件始终作为浏览器附件(即内容处置附件标头)返回。我很好奇我在这里有什么选择。
我的理想是 CDN URL 是抽象的,我的自定义 URL 是文件的公共 URL。这将允许我设置相关的响应标头等。但是,我认为这里唯一的解决方案是从 CDN 下载文件并将其缓存在我的 Web 服务器上,这会混淆 CDN 的目的。因此,大概我必须在完成服务器处理后将客户端重定向到 CDN 公共 URL。但是,有没有办法确保 Azure 返回的文件具有正确的响应标头,以确保委派浏览器的默认下载行为?
*更新*
在看到这个问题的答案时,我意识到我可能问错了问题。感谢那些在这里回答的人。后续问题在这里。
TL;DR
需要在 Blob 存储上配置默认版本,以便它向未经身份验证的客户端显示所需的标头。 这个问题中的问题具有使其工作的代码。
设置此设置后,对于匿名客户端,CDN 将复制所有标头,并且它应该按预期工作。
设置内容处置
该功能存在,可以在 Blob 属性上设置 ContentDisposition 但是,虽然这会在 Blob 上设置属性,但它不会传递到标头。
我使用以下方法使用 Powershell 对此进行了测试(只是因为它比 c# 更快)
$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
$container = Get-AzureStorageContainer -Name $ContainerName -Context $context
$blobref = ($script:container.CloudBlobContainer.GetBlobReferenceFromServer("images/pier.jpg"))
$blobref.Properties
$blobref.Properties.ContentDisposition = 'attachment; filename="fname.ext"'
$blobref.SetProperties()
$blobref = ($script:container.CloudBlobContainer.GetBlobReferenceFromServer("images/pier.jpg"))
$blobref.Properties
其中产生(除其他外)
内容处置:附件;文件名="fname.ext"
但是,查询标头时未设置任何内容
([system.Net.HttpWebRequest]::Create($blobref.Uri.AbsoluteUri)).getresponse()
(回答评论,这些是返回的标题 - 在实验时,我也尝试了使用和不使用内容类型 - 因此这里为空白)
IsMutuallyAuthenticated : False
Cookies : {}
Headers : {x-ms-request-id, x-ms-version, x-ms-lease-status, x-ms-blob-type...}
SupportsHeaders : True
ContentLength : 142224
ContentEncoding :
ContentType :
CharacterSet :
Server : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
LastModified : 01/03/2016 11:29:04
StatusCode : OK
StatusDescription : OK
ProtocolVersion : 1.1
ResponseUri : https://xxxx.blob.core.windows.net/cdn/images/pier.jpg
Method : GET
IsFromCache : False
由于 CDN 只会从 HTTP 标头本身复制信息,因此这些数据不会进入 CDN。
编辑(经过扩展评论喋喋不休!
出于众所周知的原因,Powershell 没有发送 x-ms 版本,所以我退回到 telnet,它确实产生了标头 -
HEAD /cdn/images/pier.jpg HTTP/1.1
HOST: xxxx.blob.core.windows.net
x-ms-version: 2015-04-05
HTTP/1.1 200 OK
Content-Length: 142224
Last-Modified: Tue, 01 Mar 2016 11:29:04 GMT
Accept-Ranges: bytes
ETag: "0x8D341C4B1C4F34F"
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: b4f41b01-0001-00d7-7cc9-7384c9000000
x-ms-version: 2015-04-05
x-ms-lease-status: unlocked
x-ms-lease-state: available
x-ms-blob-type: BlockBlob
Content-Disposition: attachment; filename="fname.ext"
Date: Tue, 01 Mar 2016 14:49:17 GMT