我正在使用浏览器的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调用被发送到服务器,它应该得到回复。我希望通过此响应发送文件。 那么,我该如何做到这一点?
答案 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是服务器中保存的文件的实际路径,您可以在文件提供后正常删除。