Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理从nodejs服务器下载的映像?_Javascript_Node.js_File_Express_Download - Fatal编程技术网

Javascript 如何处理从nodejs服务器下载的映像?

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

我目前正在学习node.js,最近遇到了一个情况,我想在点击网页上的按钮后下载存储在服务器上的图像。我创建了一个端点,控制器向其传递两个参数:
-要下载的图像的名称(目录是固定的)
-下载图像的名称

我已经尝试了中给出的解决方案

我使用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,它会开始下载吗?按钮通常不会重定向,角度也不会。成功了!非常感谢!