使用AngularJS从Node.JS服务器下载文件

我想从使用NodeJS运行的服务器下载浏览器的文件。 在服务器端,为服务文件我有:

exports.download = function(req, res) { var filename = "33.jpg"; var filePath = path.join(__dirname, '..', '..', 'downloads', filename); var stat = fs.statSync(filePath); var fileToSend = fs.readFileSync(filePath); res.writeHead(200, { 'Content-Type': 'image/jpeg', 'Content-Length': stat.size, 'Content-Disposition': filename }); res.end(fileToSend); }; 

存在名为33.jpg的文件,大小为744Kb。 来自客户的电话很棒

在AngularJS的客户端这里是我如何打电话来获取文件(目前参数uri不使用):

 $scope.downloadTrack = function(uri) { $http.post('/api/files/download', {uri: uri}).then(function(response) { var blob = new Blob([response.data], { type: 'image/jpeg' }); var fileName = response.headers('content-disposition'); saveAs(blob, fileName); }, function(response) { console.log('Download error'); console.log(response); }); } 

标题是好的(我可以检索文件名)

我的问题是,一个文件被下载,但大小为1.5Mb,是不可读的。 我尝试了不同的方法与stream,追加数据响应,pipe道等没有成功。 另一点(不确定是重要的):在Safari中,文件打开时显示一个破碎的图标,在Chrome中保存文件

PS:如果信息有用,我会与Yeoman一起创build项目

谢谢大家

[更新]服务器function的新版本(仍然不工作)

 exports.download = function(req, res) { var filename = "33.jpg"; var filePath = path.join(__dirname, '..', '..', 'downloads', filename); var stat = fs.statSync(filePath); var fileToSend = fs.readFileSync(filePath); res.set('Content-Type', 'image/jpeg'); res.set('Content-Length', stat.size); res.set('Content-Disposition', filename); res.send(fileToSend); }; 

[更新2]双大小的文件在文件中随机地包含额外的“efbffd”字符序列,使其不可读

将响应types的定义设置为blob解决了问题

  $http({ url: '/api/files/download', method: "POST", data: { uri: uri }, responseType: 'blob' }).success(function (data, status, headers, config) { var blob = new Blob([data], { type: 'audio/mpeg' }); var fileName = headers('content-disposition'); saveAs(blob, fileName); }).error(function (data, status, headers, config) { console.log('Unable to download the file') }); 

你正在发送响应的头,但不是使用res#end而不是使用res#send (使用S) res#send主体。

 exports.download = function(req, res) { // ... res.send(fileToSend); }; 

res#end的快速文档 :

用于快速结束没有任何数据的响应。 如果您需要使用数据进行响应,请使用res.send()和res.json()等方法。