SSRS中文件名含#的PDF链接无法在新窗口正常打开的求助
SSRS报表含#的附件链接失效问题解决
问题背景
开发基于MSSQL的SSRS报表,功能为用户输入订单号后,展示MRP系统中该订单关联的所有附件。当前遇到的问题:
- 附件文件名包含
#(如PO# 12345.PDF)时,链接无法正常打开 - 文件名不含
#时,链接功能正常
当前使用的代码
SSRS动作链接代码
="javascript:void( window.open('" & Fields!LINK.Value & "', 'blank','scrollbars=yes, toolbar=no, width=780, height=1040'))"
SQL查询代码
SELECT PURCHASE_ORDER.ID, DOCUMENT_REFERENCE.DOCUMENT_ID, [DOCUMENT].DOC_FILE_PATH, DOCUMENT_REFERENCE.CREATE_DATE, REPLACE(REPLACE(CONCAT([DOCUMENT].DOC_FILE_PATH, '/', DOCUMENT_REFERENCE.DOCUMENT_ID), 'V:\', 'http://mac-file01.mac.local/vis/'), '#', '%23') AS LINK, [DOCUMENT].DESCRIPTION, VENDOR.NAME, DOCUMENT_REFERENCE.SOURCE_TYPE FROM PURCHASE_ORDER INNER JOIN DOCUMENT_REFERENCE ON PURCHASE_ORDER.ID = DOCUMENT_REFERENCE.ID INNER JOIN [DOCUMENT] ON DOCUMENT_REFERENCE.DOCUMENT_ID = [DOCUMENT].ID INNER JOIN VENDOR ON PURCHASE_ORDER.VENDOR_ID = VENDOR.ID WHERE PURCHASE_ORDER.ID = @JobNum AND PURCHASE_ORDER.ID = DOCUMENT_REFERENCE.ID AND DOCUMENT_REFERENCE.SOURCE_TYPE = 'R'
已尝试的无效操作
在SQL脚本中将#替换为%23,报表中鼠标悬停时链接显示为%23,但点击后链接自动变回#,问题未解决。
解决方案
方案1:双重编码URL中的#字符
SSRS会自动对URL进行一次解码,因此需要在SQL中对#进行双重编码(将#替换为%2523,因为%23的URL编码是%2523)。修改SQL中的LINK字段生成逻辑:
REPLACE(REPLACE(CONCAT([DOCUMENT].DOC_FILE_PATH, '/', DOCUMENT_REFERENCE.DOCUMENT_ID), 'V:\', 'http://mac-file01.mac.local/vis/'), '#', '%2523') AS LINK
这样生成的链接中,#会被替换为%2523,SSRS解码后变为%23,浏览器打开时能正确识别为#的URL编码,避免链接失效。
方案2:在JavaScript中对链接进行URL编码
修改SSRS的动作链接代码,使用encodeURI函数对链接进行编码,确保特殊字符被正确处理:
="javascript:void( window.open(encodeURI('" & Fields!LINK.Value & "'), '_blank','scrollbars=yes, toolbar=no, width=780, height=1040'))"
注意将原代码中的'blank'改为'_blank'(符合标准窗口命名规范),同时通过encodeURI对整个链接进行编码,覆盖所有URL特殊字符的处理,不止是#。
验证方法
修改后预览报表,鼠标悬停查看链接是否显示为正确的编码格式(如%23),点击链接测试是否能正常打开附件。
内容的提问来源于stack exchange,提问作者Brian Sargent
相关产品推荐
相关产品推荐

