javascript - AngularJs 应用程序中的下载损坏

标签 javascript angularjs download

我正在尝试使用 FileSaver.js 下载文件, 但每当我点击下载按钮时,我都会得到一个损坏的文件。

应用程序由 PHP REST 服务支持,从命令行使用 cURL 确认 REST 工作正常。

这是我用于下载的伪代码的最新版本:

// Let str be the data received from $http promise
// This code is run in a "then" callback

var arr= new Uint8Array(str.length);
for(var i=0; i<str.length; i++) {
    arr[b]=str.charCodeAt(i);
};
var blob = new Blob([arr], {type: 'application/octet-stream'});
saveAs(blob, "AFileName");

它只会损坏文件。

我也尝试过不应用 Uint8Array,而是将 str 直接提供给 Blob。如您所料,它也失败了。

我正在自己编写服务器和客户端,因此我可以更改其中的任何内容。但问题是我想在客户端处理下载,我无法将用户重定向到文件 URL 来下载它,因为 REST 需要身份验证并且该 token 仅存在于 Angular 应用程序中。更改服务器只是为了处理未经身份验证的文件下载并不是一个好的选择。

REST 具有像 /files/:id 这样的 URL,当访问时,将文件内容作为常规 HTTP 文件下载提供(如上所述使用 cURL 测试)。 $http 可能是问题所在吗?以某种方式强制对接收到的数据进行某种编码或某些假设。无论如何,我在 Angular 方面经验不多。

最佳答案

我发现了问题。是我:)

我必须为 $http 指定 responseType: "arraybuffer",然后将 str 直接提供给 Blob

固定代码

// Let str be the data received from $http promise
// This code is run in a "then" callback
// Make sure to specify "responseType: "arraybuffer"" for $http

var blob = new Blob([str], {type: 'application/octet-stream'});
saveAs(blob, "AFileName");

我在错误的地方更改了 responseType

关于javascript - AngularJs 应用程序中的下载损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051467/

相关文章:

javascript - 设置具有特定计算 CSS 属性值的元素数组的样式

javascript - $httpBackend.flush 在服务抛出错误时失败

javascript - 通过 Typescript 类扩展 JavaScript 对象原型(prototype)

javascript - 使用 typescript 导入外部javascript的最佳方法

Java:当 URL 请求身份验证时从 URL 下载文件

java代码从服务器下载图像到客户端

javascript - 错误: cannot read property 'get' of undefined - HTTPS in node.js

javascript - 如何在外部和内部链接脚本?

xcode - 在哪里可以下载旧版本的 Xcode?

javascript - 全局 JavaScript 变量在 jQuery 更改事件中不可访问