我在用户将文件上传到S3的表单上工作。如果用户在未验证的情况下离开表单,即使上传文件,也应取消上传文件并从S3中删除文件。
我从S3存储桶中删除文件没有问题。但是,我需要能够在用户离开当前路径(即页面)之前删除,如果下一个路由是同一页面(即页面刷新),则跳过它。
这是一个与this one on Github非常相似的问题,他们说,基本上,它无法完成。 Several other similar也存在问题,但没有一个能提供令人满意的答案。
我想检查一下是否有可能,因为在我看来这是一个至关重要的功能,我希望其他人可能已经处理过它。
如果无法完成,您会建议采取哪种解决方法?
答案 0 :(得分:1)
这听起来真的很难,如果用户退出浏览器或他们的计算机失去电源怎么办?没有办法确保您可以在浏览器关闭之前在客户端上执行代码,因此您需要服务器上的某些内容。
我不知道你的整个流程,但我想你正在做一些事情,例如为新帐户上传个人资料照片&如果未创建帐户,则删除它。我建议像临时区域这样的东西。他们上传了pic&在你的数据库中你有s3 url&一个confirmed
标志。 confirm标志默认为false,并在保存表单时切换。然后,您每上每周/每周都会在上传的每张新图片上运行一个cron作业。删除那些未经确认的人。
这有一个额外的好处,如果他们不小心关闭浏览器,你是一个冠军&保存了他们的进步。
答案 1 :(得分:1)
我发现了一个很好的技巧来检测用户何时离开当前页面。这是食谱:
将订阅(即使为空)附加到路由控制器。这样,route loaded
= subscription active
和route left
= subscription stopped
添加onStop()
函数,并将用户离开页面时需要执行的所有服务器端代码放入其中。这是我的出版物的外观(当页面遗漏时相关表单尚未提交时我删除了上传的文件):
Meteor.publish("files", function(sessionId) {
var self = this;
// Here I clean all the files I need to remove because the user has
// not submitted the current form.
self.onStop(function () {
console.log (sessionId + " is cleaning...");
cleanFiles(sessionId)
});
// I look for files related to the current upload session only
if(Users.isInRoles(this.userId, ["user"])) {
return Files.find({"session_id":sessionId, "owner":this.userId}, {});
}
//and I make my publication available in case the if statement failed
return self.ready();
});
底线: 据我所知,它就像一个魅力。这是跟踪用户活动并在离开页面或子页面(我们附加订阅的模板路径)后执行代码的好方法。