为什么我的AJAX文件下载,使用基于Blob的对象url,破坏文件

Why is my AJAX file download, using Blob based object URLs, corrupting files?

本文关键字:url 对象 文件 Blob AJAX 我的 文件下载 为什么      更新时间:2023-09-26

我需要构建允许用户从经过身份验证的REST服务下载文件的功能。对文件的GET请求必须使用设置为oauth访问令牌的"Authorization"头。我使用超级代理库通过AJAX发出这个请求没有问题,但是将返回的文件转换为可下载的链接就有问题了。这是我目前正在使用的。

api.getFile(file.name, function (err, res) {
    var windowUrl = window.URL || window.webkitURL;
    var blob = new Blob([res.text], {type: res.type});
    var dataUrl = windowUrl.createObjectURL(blob);
    callback(dataUrl);
});

我请求文件。获得正确的窗口。基于浏览器的URL对象。用作为res.text返回的文件内容和作为res.type返回的mime类型创建一个blob。使用windowUrl对象从blob创建对象URL。然后回调保存此数据url,以便我可以创建如下链接。

<a href={file.dataUrl} download={file.name} target="_blank">{file.name}</a>

此策略适用于简单的基于文本的文件类型,如。txt或。json,但对于更复杂的类型会导致问题。经过此过程后png将无法打开并抛出一般损坏错误。我也试过用PDF,它打开并有正确的页数,但内容是空白的。

我还验证了REST服务不会通过curl下载各种文件而导致损坏。

你知道会发生什么吗?如果有更好的选择,我也愿意采用其他策略进行身份验证文件下载。

我能够通过不同的策略获得经过身份验证的下载。当用户单击下载链接时,不是对文件内容发出请求,而是对单个使用访问令牌发出请求以下载该文件。然后将令牌设置为文件url上的查询参数,然后使用

自动触发该查询参数进行下载。
window.open(url);

我的特殊问题已经解决了,但我仍然好奇是否有一种方法可以使用我以前的策略而不会出现腐败问题。