有没有一种方法可以强制将 Azure CDN 文件作为浏览器附件下载?
Is there an approach to force a Azure CDN file to download as a browser attachment?
我们正在构建一个 ASP.NET 与 DAM(数字资产管理)系统集成的 Web 应用程序。 DAM 将文件存储在 Azure blob 存储中,并public仅使用 Azure CDN 使它们可用。
我们将使这些文件(大多数为 PDF)可供从我们的网络应用程序下载。当用户请求这些文件之一时,我们将提供一个自定义 URL,它将 运行 服务器上的一些代码(记录下载等),然后返回相关文件以供下载。
客户端要求文件始终作为浏览器附件(即内容处理附件 header)返回。我很好奇这里有哪些选项。
我的理想是 CDN URL 是抽象的,我的自定义 URL 是文件的 public URL。这将允许我设置相关响应 headers 等。但是,我认为这里唯一的解决方案是从 CDN 下载文件并将其缓存在我的 Web 服务器上,这会混淆 CDN 的目的。所以大概我必须在完成服务器处理后将客户端重定向到 CDN public URL。但是有没有一种方法可以确保 Azure 以正确的响应 headers 返回文件,以确保授权浏览器的默认下载行为?
*更新*
看到这个问题的答案,我意识到我可能问错了问题。谢谢你们中那些在这里回答的人。 .
TL;DR
您需要在 blob 存储上配置默认版本,以便它向 non-authenticated 客户端显示所需的 header。 this question 中的问题具有使其工作的代码。
设置完成后,为匿名客户端工作,CDN 将复制所有 headers,它应该按预期工作。
设置 ContentDisposition
功能存在,您可以在 blob property 上设置 ContentDisposition 但是,虽然这会在 blob 上设置 属性,但它不会传递到 header。
我用 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
产生(除其他外)
ContentDisposition : attachment; filename="fname.ext"
但是当 header 被查询时没有设置任何东西
([system.Net.HttpWebRequest]::Create($blobref.Uri.AbsoluteUri)).getresponse()
(回答评论,这些是返回的 headers - 在试验时我也尝试过使用和不使用内容类型 - 因此这里是空白的)
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 header 本身复制信息,因此该数据不会进入 CDN。
已编辑(经过长时间的评论喋喋不休!)
出于众所周知的原因,Powershell 没有发送 x-ms-version,所以我转而使用确实产生了 header -
的 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
我们正在构建一个 ASP.NET 与 DAM(数字资产管理)系统集成的 Web 应用程序。 DAM 将文件存储在 Azure blob 存储中,并public仅使用 Azure CDN 使它们可用。
我们将使这些文件(大多数为 PDF)可供从我们的网络应用程序下载。当用户请求这些文件之一时,我们将提供一个自定义 URL,它将 运行 服务器上的一些代码(记录下载等),然后返回相关文件以供下载。
客户端要求文件始终作为浏览器附件(即内容处理附件 header)返回。我很好奇这里有哪些选项。
我的理想是 CDN URL 是抽象的,我的自定义 URL 是文件的 public URL。这将允许我设置相关响应 headers 等。但是,我认为这里唯一的解决方案是从 CDN 下载文件并将其缓存在我的 Web 服务器上,这会混淆 CDN 的目的。所以大概我必须在完成服务器处理后将客户端重定向到 CDN public URL。但是有没有一种方法可以确保 Azure 以正确的响应 headers 返回文件,以确保授权浏览器的默认下载行为?
*更新*
看到这个问题的答案,我意识到我可能问错了问题。谢谢你们中那些在这里回答的人。
TL;DR
您需要在 blob 存储上配置默认版本,以便它向 non-authenticated 客户端显示所需的 header。 this question 中的问题具有使其工作的代码。
设置完成后,为匿名客户端工作,CDN 将复制所有 headers,它应该按预期工作。
设置 ContentDisposition
功能存在,您可以在 blob property 上设置 ContentDisposition 但是,虽然这会在 blob 上设置 属性,但它不会传递到 header。
我用 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
产生(除其他外)
ContentDisposition : attachment; filename="fname.ext"
但是当 header 被查询时没有设置任何东西
([system.Net.HttpWebRequest]::Create($blobref.Uri.AbsoluteUri)).getresponse()
(回答评论,这些是返回的 headers - 在试验时我也尝试过使用和不使用内容类型 - 因此这里是空白的)
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 header 本身复制信息,因此该数据不会进入 CDN。
已编辑(经过长时间的评论喋喋不休!)
出于众所周知的原因,Powershell 没有发送 x-ms-version,所以我转而使用确实产生了 header -
的 telnetHEAD /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