伙计:我正在创建一个Angular / Node应用程序,用户通过选择相关的缩略图来下载文件。
问题:类似于this post - 当点击删除按钮时,想法是停止下载 - 这就是为什么我认为我只是删除文件。
但是,我正在使用fs.createWriteStream
,当文件被删除时,无论文件是否存在,流都会继续显示。然后,这会导致file.on('finish', function() {
状态启动并显示成功消息。
要解决此问题,我会检查finish
状态启动时文件路径是否存在,以便正确显示成功消息。这感觉非常hacky,特别是在下载大文件时。
有没有办法在删除文件时取消流进度?
答案 0 :(得分:1)
在您的评论'是,就像那样'之后,我有一个问题。您显然是在客户端系统中创建文件,并在流中编写。你是如何从浏览器中做到的?您是否使用任何API来访问浏览器中节点的核心模块?与browserify一样。
话虽如此,如果我的理解是正确的,你可以通过以下方式实现这一目标
var http = require("http"),
fs = require("fs"),
stream = require("stream"),
util = require("util"),
abortStream=false, // When user click on delete, update this flag to true
ws,
Transform;
ws = fs.createWriteStream('./op.jpg');
// Transform streams read input, process data [n times], output processed data
// readStream ---pipe---> transformStream1 ---pipe---> ...transformStreamn ---pipe---> outputStream
// @api https://nodejs.org/api/stream.html#stream_class_stream_transform
// @exmpl https://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
Transform = stream.Transform || require("readable-stream").Transform;
function InterruptedStream(options){
if(!(this instanceof InterruptedStream)){
return new InterruptedStream;
}
Transform.call(this, options);
}
util.inherits(InterruptedStream, Transform);
InterruptedStream.prototype._transform = function (chunkdata, encoding, done) {
// This is just for illustration, giving you the idea
// Do not hard code the condition here.
// Suggested to give the condition during constructor call, may be
if(abortStream===true){
// Take care of this part.
// Your logic might try to write in the stream after it is closed.
// You can catch the exception but before that try not to write in the first place
this.end(); // Stops the stream
}
this.push(chunkdata, encoding);
done();
};
var is=new InterruptedStream();
is.pipe(ws);
// Download large file
http.get("http://www.zastavki.com/pictures/1920x1200/2011/Space_Huge_explosion_031412_.jpg", function(res) {
res.on('data', function(data) {
is.write(data);
// Simulates click on delete button
setTimeout(function(){
abortStream=false;
res.destroy();
// Delete the file, I think you have the logic in place
}, 2000);
}).on('end', function() {
console.log("end");
});
});
上面的代码片段粗略地介绍了如何完成它。您可以复制粘贴它,运行(它将起作用)并进行更改。
如果我们不在同一页面,请告诉我,我会尽力纠正我的答案。
答案 1 :(得分:0)
我认为您可以在删除文件时发出事件并在
中捕获该事件var wt = fs.createWriteStream();
wt.on('eventName',function(){
wt.emit('close');
})
这将关闭你的writableStream。
应该从客户端触发和删除事件。