如何在iframe中显示Azure Blob存储的PDF文档?
问题描述
我在Azure Blob存储中存储了大量PDF文档,希望通过iframe将指定PDF的URL嵌入网页,示例代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>iFrame PDF Example</title> </head> <body> <h1>A PDF Document Embedded in a Web Page</h1> <iframe src="https://azure.server/my-container/folder/my-document.pdf" width="100%" height="800px"></iframe> </body> </html>
该代码对Web托管的PDF有效,但使用Blob URL时出现错误:
ResourceNotFoundThe specified resource does not exist. RequestId:********-****-****-****-************ Time:2023-02-27T17:44:33.2977066Z
直接在浏览器打开该Blob URL也会出现相同错误,但Blob确实存在,且Azure UI中其内容类型为application/pdf。我已将容器访问级别设为公开(身份验证方式为Access key),且能生成容器的SAS令牌,但不知如何使用,请问该如何配置?
解决方案
一、先确认公开容器的配置细节
虽然你设置了容器为公开,但先排查几个容易踩坑的点:
- 容器访问级别要选Blob(匿名读取对blob的访问),这个级别足够支持iframe嵌入;同时务必检查Blob URL格式是否正确:正确格式是
https://<存储账户名>.blob.core.windows.net/<容器名>/<Blob完整路径(含文件夹)>.pdf,很多错误是因为漏了.blob.core.windows.net这个后缀,或者存储账户名、容器名、Blob路径拼写错误。 - 注意Azure Blob的文件名(包括文件夹路径)是区分大小写的,确认你用的URL和Blob实际名称完全匹配。
二、用SAS令牌实现授权访问
如果公开容器的方式仍有问题,或者你不想让容器完全公开,可以用SAS令牌来授权访问:
1. 生成符合要求的SAS令牌
在Azure门户生成SAS令牌时,注意这几个关键设置:
- 选择Blob或容器级别(批量访问容器内Blob选容器级别更方便)
- 权限只需要勾选读取即可(嵌入PDF不需要其他权限)
- 设置合理的过期时间,避免令牌过早失效
- 可选设置HTTPS仅访问、允许的IP范围来提升安全性
2. 拼接SAS令牌到Blob URL
生成SAS令牌后,直接把它拼在Blob URL的末尾,格式如下:
https://<存储账户名>.blob.core.windows.net/<容器名>/<Blob路径>.pdf?<SAS令牌>
然后把这个完整URL填入iframe的src属性,示例代码:
<iframe src="https://mystorage.blob.core.windows.net/my-container/folder/my-document.pdf?sv=2022-11-02&ss=b&srt=sco&sp=r&se=2024-12-31T23:59:59Z&st=2023-03-01T00:00:00Z&spr=https&sig=xxxxxx" width="100%" height="800px"></iframe>
三、额外排查项
- 再次确认Blob的内容类型确实是
application/pdf,如果上传时没设置,可在Azure门户找到该Blob,进入“属性”页面修改内容类型。 - 检查存储账户是否配置了防火墙或虚拟网络限制,如果有,需要将网页的访问IP加入允许列表,或者临时开启“允许从所有网络访问”测试是否是这个原因导致的访问失败。
内容的提问来源于stack exchange,提问作者W.P. McNeill
相关产品推荐
相关产品推荐

