ZK8 Filedownload.save 剪切文件名

ZK8 Filedownload.save Cut Filenames

我用"Filedownload.save"用Zk下载文件,但遇到问题

Zk 把我的文件名剪掉了一些字符,例如,如果linema 是"FISH#CHIPS.pdf",文件下载为"FISH.pdf"

有人知道怎么解决吗?

更新:

我已经按照说明操作了,我终于看到服务器响应了这个 JSON:

{"rs":[["download",["/myApp/zkau/view/z_aq5/dwnmed-3/son/FISH#CHIPS.pdf"]]],"rid":9}

我现在迷路了,Zk 在客户端用这个 JSON 做什么?

问题是 # 是那些“保留字符”之一,虽然在 URL 中有效,但会以特殊方式处理。查看 this question for more details. My guess is that everything after the # is interpreted as a fragment on the page,因此在这种情况下被忽略。

有多种方法可以解决此问题,例如将 # 替换为 %23。但是在调用 Filedownload.save 时在服务器端执行此操作会将文件名更改为 FISH%23CHIPS.pdf.

相反,当您显示的响应到达时,我们可以拦截下载文件的客户端方法。这样,zk 仍会为文件指定其正常名称,并且只有下载会清理 URL。将其添加到脚本标签或加载的 js 文件中:

zk.afterLoad('zk', function() {
    var oldMethod = zAu.cmd0.download;
    zAu.cmd0.download = function(filename) {
        return oldMethod(filename.replace(new RegExp('#', 'g'), '%23'));
    }
});

然后它将下载具有完整名称的文件。您可能还想花额外的时间清理其他保留字符。阅读 this wiki article about "percent encoding" 以获得正确的代码。

我也用 zk 提交了 a support ticket,我认为这应该由开箱即用的客户端方法处理。

官方 ZK-Bug 被跟踪为 ZK-3809

服务器端解决方法如下:

拆分下载代码如...

Filedownload.save("test content", "text/plain", "test#test.txt");

...进入...

AMedia media = new AMedia("test#test.txt", "txt", "text/plain", "test content");
Clients.response(new AuDownload((DeferredValue) () -> 
    Executions.getCurrent().getDesktop().getDownloadMediaURI(
        media, "test#test.txt").replace("#", "%23")));

...允许根据需要对特殊字符进行编码。


更新: ZK-3809 已修复并将包含在 ZK 版本 8.5.1