如何处理从nodejs服务器下载图像
How to handle downloads of an image from a nodejs server?
我目前正在学习node.js,最近遇到了一种情况,我想在点击网页上的一个按钮后下载存储在服务器上的图像。我已经创建了一个端点,控制器将两个参数传递给它:
—待下载的镜像名称(目录固定)
-下载图像的名称
我已经尝试了使用Express从NodeJS服务器下载文件中给出的解决方案
我使用angular来填充按钮并触发下载,如下所示:
<div class="btn-group" role="group" aria-label="Image tags">
<button ng-repeat="tag in imageTags" type="button" class="btn btn-outline-warning" ng-click="download(tag)">{{tag}}</button>
</div>
这是我的控制器:
$scope.download = function(tagName) {
tagName = tagName.replace(/'W+/g, '-');
Clarifai.download(tagName, UploadSuccess.uploadedFile)
// UploadSuccess.uploadedFile contains the name of the file to be downloaded.
.success(function(data) {
//do something
});
}
调用以下工厂方法:
download: function(tagName, imageName) {
return $http.get('/api/clarifai/tagDownload/' + tagName + "/" + imageName);
}
这是我的路由文件的相关部分:
app.get('/api/clarifai/tagDownload/:tagName/:imageName', function(req, res) {
// Ignore tagName for now.
console.log("Begin download");
var img = path.resolve('image_dump/OutputDump/' + req.params.imageName);
// Returns the expected path for the file
var filename = path.basename(img);
var mimetype = mime.lookup(img);
console.log(filename);
console.log(mimetype);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(img);
filestream.pipe(res);
res.on('finish', function(){
console.log("Download complete");
});
});
所以所有的流都工作到这里,单击其中一个按钮后,我得到如下输出:
Begin download
Jon-1477683540996.jpg
image/jpeg
GET /api/clarifai/tagDownload/people/Jon-1477683540996.jpg 200 5.296 ms -
Download complete
但是我没有看到任何下载文件的迹象。任何浏览器上都没有对话框。到目前为止,我读到的所有答案似乎都提到了下载是由pipe
调用处理的。但是我没有成功。
我也尝试过res.download(img)
,但结果相同。
我的方法是使用控制器内部的回调来处理这个。但我不知道该怎么做。我错过了什么/做错了什么?谁能给我指个正确的方向?
提前感谢。
为了完整起见,我是这样解决这个问题的:
在我的控制器中,而不是使用:
$http.get('/api/clarifai/tagDownload/' + tagName + "/" + imageName);
I had to do:
path = "/api/clarifai/tagDownload/" + tagName + "/" + imageName;
$window.location.href = path;
正如adeneo指出的那样,这样做的原因是在Angular中点击按钮不会重定向。所以,这必须使用Angular的$window.location.href
API手动触发。
相关文章:
- 与域在同一台计算机上运行的NODEJS服务器的CORS错误
- Nodejs服务器在解析之前生成输入表单
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- NodeJS服务器在检索部分时返回505/404错误
- 将数据发布到nodejs服务器到客户端
- 引用nodejs服务器中html中的java脚本文件
- 正在将数据发送到nodejs服务器
- NodeJs:如何在EC2实例中查看PM2运行的NodeJS服务器的日志
- 为什么我可以't在nodeJS服务器上接收文件
- nodeJS服务器性能缓慢且不稳定
- 需要将数据从NodeJS服务器发送回JQuery客户端
- 如何从本地文件夹(磁盘存储)读取或获取图像文件,并使用nodejs服务器将其发送到Angularjs
- 在nodejs服务器上提供文件的更好方法,而不是if/else
- 如何在 NodeJS 服务器中解析 ajax 发送的数组/对象
- 在 nodejs 服务器端运行传单
- 当我尝试在 couchbase nodejs 服务器上运行简单的测试时,我收到“不正确的参数”错误
- Yeoman 应用程序 - 使用自定义 Nodejs 服务器
- JavaScript 在 nodeJS 服务器上导致错误
- Nodejs 服务器端调试
- 将数据从 Java 客户端发送到 NodeJS 服务器