从节点发送文件到客户端进行下载

我正在使用浏览器的ajax调用,所以,在button上点击一个函数被称为路由'/文件'

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'); 

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

这是我使用button单击从浏览器发出的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(); }; 

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

将获取请求传递给一个href标签,它会将文件下载到客户端,在服务器端编写文件以便创build文件,您必须在服务器端创build文件,然后提供文件通过res.download到客户端,稍后从服务器端删除文件,以便下载文件在clinet端假设你的url看起来像http://getsomefile.com/xyz?newfile=video.mp4然后在你的客户端标签你可以有这个url作为一些域名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是保存在服务器中的文件的实际path,您可以在提供文件后正常删除文件。