如何处理从nodejs服务器下载图像

How to handle downloads of an image from a nodejs server?

本文关键字:nodejs 服务器 下载 图像 何处理 处理      更新时间:2023-09-26

我目前正在学习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手动触发。

在AngularJS中使用$window或$location来重定向