Javascript 如何处理从nodejs服务器下载的映像?
我目前正在学习node.js,最近遇到了一个情况,我想在点击网页上的按钮后下载存储在服务器上的图像。我创建了一个端点,控制器向其传递两个参数:Javascript 如何处理从nodejs服务器下载的映像?,javascript,node.js,file,express,download,Javascript,Node.js,File,Express,Download,我目前正在学习node.js,最近遇到了一个情况,我想在点击网页上的按钮后下载存储在服务器上的图像。我创建了一个端点,控制器向其传递两个参数: -要下载的图像的名称(目录是固定的) -下载图像的名称 我已经尝试了中给出的解决方案 我使用angular填充按钮并触发下载,如下所示: <div class="btn-group" role="group" aria-label="Image tags"> <button ng-repeat="tag in imageTags
-要下载的图像的名称(目录是固定的)
-下载图像的名称 我已经尝试了中给出的解决方案 我使用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>
Begin download
Jon-1477683540996.jpg
image/jpeg
GET /api/clarifai/tagDownload/people/Jon-1477683540996.jpg 200 5.296 ms -
Download complete
它调用以下工厂方法:
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");
});
});
因此,所有的流程一直工作到这一点,单击其中一个按钮,我得到如下输出:
<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>
Begin download
Jon-1477683540996.jpg
image/jpeg
GET /api/clarifai/tagDownload/people/Jon-1477683540996.jpg 200 5.296 ms -
Download complete
但我看不到任何下载文件的迹象。任何浏览器上都没有对话框。到目前为止,我读到的所有答案似乎都提到下载是由管道
调用处理的。但我没有成功
我也尝试过res.download(img)
,但结果相同
我的方法是使用控制器内部的回调来处理这个问题。但我不知道该怎么做。我错过了什么/做错了什么?谁能给我指一下正确的方向吗
提前谢谢。为了完整起见,以下是我解决问题的方法:
在我的控制器中,而不是使用:
$http.get('/api/clarifai/tagDownload/'+tagName+“/”+imageName);
我必须做:
path=“/api/clarifai/tagDownload/”+标记名+“/”+图像名;
$window.location.href=路径;
正如adeneo所指出的,这样做的原因是点击Angular中的按钮不会重定向。因此,这必须使用Angular的$window.location.href
API手动触发
在下面的答案中也可以找到一些替代方法:为了完整起见,下面是我解决问题的方法:
在我的控制器中,而不是使用:
$http.get('/api/clarifai/tagDownload/'+tagName+“/”+imageName);
我必须做:
path=“/api/clarifai/tagDownload/”+标记名+“/”+图像名;
$window.location.href=路径;
正如adeneo所指出的,这样做的原因是点击Angular中的按钮不会重定向。因此,这必须使用Angular的$window.location.href
API手动触发
在这个答案中还可以找到一些替代方法:如果您使用Express,您应该能够只执行
res.download('image\u dump/OutputDump/'+req.params.imageName)
@adeneo,我已经尝试过了。但是没有运气。没有下载对话框。文件也不在我的默认下载目录中。如果您只是在浏览器中键入URL,它会开始下载吗?按钮通常不会重定向,角度也不会。成功了!非常感谢!如果您使用的是Express,您应该能够只进行res.download('image\u dump/OutputDump/'+req.params.imageName)
@adeneo,我已经尝试过了。但是没有运气。没有下载对话框。文件也不在我的默认下载目录中。如果您只是在浏览器中键入URL,它会开始下载吗?按钮通常不会重定向,角度也不会。成功了!非常感谢!