将文件从节点发送到客户端以供下载

时间:2017-11-12 09:48:02

标签: javascript node.js ajax express

我正在使用浏览器的ajax调用 所以,点击按钮 调用一个函数 路线'/文件'

app.get('/filez',function(req,res){
    var id = req.params.id;
    console.log('id is : ',id);

  var video =   ytdl(url, { filter: (format) => format.container === 'mp4' })
    .pipe(fs.createWriteStream('video.mp4'));
    res.download('video.mp4');

现在,该文件正在下载到服务器。 但我想要做的是发送文件,以便客户端可以从浏览器下载它。 我不希望将文件下载到服务器。

这是我使用按钮点击从浏览器发出的ajax请求。 我想把文件作为可以下载到客户端计算机的响应。

function myAjaxCall(){
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
        if(xhr.readyState ===XMLHttpRequest.DONE && xhr.status ===200){
            console.log('response has come',xhr.response);
            return xhr.response;
        }
    };
    xhr.open('GET','/filez',true);
    xhr.send();
};

解释:嗯,不是真的。我正在考虑更多这些方面 - 所以在按钮上单击ajax调用被发送到服务器,它应该得到回复。我希望通过此响应发送文件。 那么,我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

在href标记中传递get请求,它会将文件下载到客户端,您正在服务器端编写文件,因此正在创建它们,您必须在服务器端创建该文件然后通过res.download将文件提供给客户端,然后从服务器端删除文件以在clinet端下载文件 假设您的网址看起来像http://getsomefile.com/xyz?newfile=video.mp4,那么在您的客户端,您可以将此网址设置为某个网址http://getsomefile.com,并使用路由xyz来提供此文件

<a href="http://getsomefile.com/xyz?newfile=video.mp4" download>

我在客户端假设你有一些定义为

的路线
  app.get('/xyz,function(req,res){
         var file = req.query.newfile;

        })

然后你可以使用fs.unlink通过cron删除文件,或者使用手动清理器或做类似的事情

 app.get('/xyz', function(req, res){
     var file = req.query.newfile
        res.download(realFilepath, file , function(err) {
            if (!err) {
                fs.unlink(realFilepath);
            }
        });
    });

realFilepath是服务器中保存的文件的实际路径,您可以在文件提供后正常删除。