如何在Business Central中将BLOB格式PDF文件设为可下载URL?
在Business Central中实现PDF文件同域名访问的方案
一、修复自定义API方案(推荐)
你之前尝试的HttpResponseMessage无法直接设置二进制响应体,是因为Business Central的自定义API中返回该类型仅支持JSON/文本内容。正确的做法是使用API页面的Response对象输出二进制流,示例代码如下:
page 50100 "PDF Document API" { PageType = API; APIPublisher = '你的发布者ID'; APIGroup = '你的API组'; APIVersion = 'v1.0'; EntityName = 'pdfDocument'; EntitySetName = 'pdfDocuments'; SourceTable = "你的PDF存储表"; // 替换为实际存储PDF的表名 layout { area(content) { } } actions { area(processing) { action(GetPDFContent) { APIPublisher = '你的发布者ID'; APIGroup = '你的API组'; APIVersion = 'v1.0'; HttpMethod = GET; Route = 'pdfDocuments({id})/content'; Isolated = true; trigger OnAction() var InStr: InStream; begin // 从表中读取PDF流 Rec.Data.CreateInStream(InStr); // 设置响应头 Response.ContentType := 'application/pdf'; Response.AddHeader('Content-Disposition', 'inline; filename="Invoice.pdf"'); // 输出流到响应 Response.WriteFromStream(InStr); end; } } } }
部署后,通过访问/api/v1.0/companies({companyId})/pdfDocuments({recordId})/content即可获取PDF文件,该地址与Business Central同域名,不会触发CORS错误。
二、替代方案:使用内置媒体资源表
如果自定义API的方式不适用,可将PDF存储到Business Central内置的Media表,通过标准API端点访问:
1. 将PDF存入Media表
procedure SavePDFToMedia() var MediaRec: Record Media; InStr: InStream; begin Rec.Data.CreateInStream(InStr); // 导入PDF到Media表 MediaRec.ImportStream(InStr, 'Invoice.pdf', 'application/pdf'); MediaRec.Insert(); // 记录MediaRec.Id,后续用于生成访问URL end;
2. JS控件中访问PDF
使用标准媒体资源API地址:
/api/v2.0/companies({companyId})/media({mediaId})/$value
该地址同样属于Business Central同域名,直接在JS控件中通过此URL加载PDF即可。
三、其他替代方案
若你有同域名的外部存储服务(如配置了自定义域名的Azure Blob存储),可将PDF上传至该存储,直接通过存储URL访问。但此方式需要额外的存储配置,优先级低于前两种方案。
内容的提问来源于stack exchange,提问作者RWC
相关产品推荐
相关产品推荐

