上传问题,如何在用户没有保存时删除已上传文件

问题描述

实际情况是:有一个web页面,用户可以新建教程.这个过程中用户可以上传相关的图片和文件,当用户点保存时,将文件路径写入数据库。问题是:如果用户一直上传,但最后却不点击保存,如何处理那些已上传的文件?(特别情况是用户打开了很多个页面,上传后都不保存)请各位发表意见...

解决方案

解决方案二:
上传之后先保存在临时路径,保存的时候再把文件拷贝到正式路径如果没保存,就不用拷贝临时路径的文件最终都要删除------------------------------------------------------------------------------------------------
解决方案三:
如果最终只上传一个的话,保存后在用户相关表里记录下上传后保存的位置,然后当用户再次上传时,先根据临时保存字段判断上次的是否有保存(保存时需要将该字段清空),如果不为空,就删除该文件
解决方案四:
一楼的办法可行。用临时文件的办法。
解决方案五:
你应该先为人家保存2小时,超过2小时就可以删除了。
解决方案六:
引用1楼FoxDave的回复:

上传之后先保存在临时路径,保存的时候再把文件拷贝到正式路径如果没保存,就不用拷贝临时路径的文件最终都要删除------------------------------------------------------------------------------------------------

嗯。这是一种做法,但如果不是自己的服务器,那怎么办?
解决方案七:
引用2楼starfd的回复:

如果最终只上传一个的话,保存后在用户相关表里记录下上传后保存的位置,然后当用户再次上传时,先根据临时保存字段判断上次的是否有保存(保存时需要将该字段清空),如果不为空,就删除该文件

不是只上传一个。你这个做法,如果我打开两个页面,或者两个浏览器呢?
解决方案八:
引用3楼stubble的回复:

一楼的办法可行。用临时文件的办法。

那如果用户同时打开两个页面操作,那第二次操作不就覆盖第一次的了。
解决方案:
引用5楼skyandcode的回复:

Quote: 引用1楼FoxDave的回复:
上传之后先保存在临时路径,保存的时候再把文件拷贝到正式路径如果没保存,就不用拷贝临时路径的文件最终都要删除------------------------------------------------------------------------------------------------

嗯。这是一种做法,但如果不是自己的服务器,那怎么办?

那也要有权限啊,否则怎么写文件呢
解决方案:
既然“保存”时就是“将文件路径写入数据库”的动作,那么你其实本可以准确知道文件有没有保存。你只是要判断多长时间算是“超时未保存”就行了。但是你后来纠结于“服务器程序不是自己可动手写的”、“不同上传时文件名会重复”的问题,那么你的其它干扰性的问题就“太多了”。你还是先搞明白哪一个先要在这个问题之前去搞明白吧,
解决方案:
引用8楼FoxDave的回复:

Quote: 引用5楼skyandcode的回复:
Quote: 引用1楼FoxDave的回复:
上传之后先保存在临时路径,保存的时候再把文件拷贝到正式路径如果没保存,就不用拷贝临时路径的文件最终都要删除------------------------------------------------------------------------------------------------

嗯。这是一种做法,但如果不是自己的服务器,那怎么办?

那也要有权限啊,否则怎么写文件呢

我的意思是什么时候删除临时文件?不要认为手动删除的。
解决方案:
引用9楼sp1234的回复:

既然“保存”时就是“将文件路径写入数据库”的动作,那么你其实本可以准确知道文件有没有保存。你只是要判断多长时间算是“超时未保存”就行了。但是你后来纠结于“服务器程序不是自己可动手写的”、“不同上传时文件名会重复”的问题,那么你的其它干扰性的问题就“太多了”。你还是先搞明白哪一个先要在这个问题之前去搞明白吧,

嗯。谢谢你的回答。文件上传重名这些问题已经解决。我的意思是,什么时候删除未保存的临时文件(不能手动删除)。“超时未保存”这个可以考虑。
解决方案:
引用8楼FoxDave的回复:

Quote: 引用5楼skyandcode的回复:
Quote: 引用1楼FoxDave的回复:
上传之后先保存在临时路径,保存的时候再把文件拷贝到正式路径如果没保存,就不用拷贝临时路径的文件最终都要删除------------------------------------------------------------------------------------------------

嗯。这是一种做法,但如果不是自己的服务器,那怎么办?

那也要有权限啊,否则怎么写文件呢

程序读写都是没问题的,关键是何时删除临时文件。
解决方案:
当然是你是否保存操作的最后啊。。。
解决方案:
引用7楼skyandcode的回复:

Quote: 引用3楼stubble的回复:
一楼的办法可行。用临时文件的办法。

那如果用户同时打开两个页面操作,那第二次操作不就覆盖第一次的了。

可以都保存到临时文件文件路径名可以根据时间戳来设定。
解决方案:
算一下时间就好了时间超过了就删除
解决方案:
临时文件夹,文件名用用户名和时间戳动态生成,以保证不会重复,定时清理或者如果不是互联网应用,就是小局域网的话,完全可以为每个用户动态创建个文件夹(在用户第一次登陆的时候判断如果文件夹不存在则创建),然后等用户下一次登陆的时候判断文件夹存在就删除清空
解决方案:
引用14楼stubble的回复:

Quote: 引用7楼skyandcode的回复:
Quote: 引用3楼stubble的回复:
一楼的办法可行。用临时文件的办法。

那如果用户同时打开两个页面操作,那第二次操作不就覆盖第一次的了。

可以都保存到临时文件文件路径名可以根据时间戳来设定。

现在是何时删除临时文件的问题。
解决方案:
引用13楼FoxDave的回复:

当然是你是否保存操作的最后啊。。。

如果用户没保存呢
解决方案:
引用16楼Z65443344的回复:

临时文件夹,文件名用用户名和时间戳动态生成,以保证不会重复,定时清理或者如果不是互联网应用,就是小局域网的话,完全可以为每个用户动态创建个文件夹(在用户第一次登陆的时候判断如果文件夹不存在则创建),然后等用户下一次登陆的时候判断文件夹存在就删除清空

嗯。这个问题我有考虑过,在用户登录时,开一个异步线程去检查文件。如果是定时清理的话,是不是缓存文件的路径,在缓存过期时清理呢?
解决方案:
这种情况应该定清理,比如每隔24小时或更长时间,比如当用户上传文件时,检查上次清理的时间(保存在与临时上传文件一样的表中),如果超过设定的时间,就对上传文件临时表中的文件列表进行清理,每个文件路径后应该还有个上传时间字段,检查此字段的值,如果超出指定时间就删除此文件,同时删除临时表中的相应的记录,或者你也可以设为在后台手动点击清理按钮开始清理,如果用户量不大,三五天或者十来八天清理一次也没问题
解决方案:
引用15楼Mockqi的回复:

算一下时间就好了时间超过了就删除

是否是缓存文件的路径,过期了就删除?如果有很多用户同时做这个操作,是否会有问题?
解决方案:
那你就把用户上传和保存写在一起,用户上传只是个假象,并不一定是真的把文件上传了,此时可以取到文件路径。点击保存的时候再真正上传并保存其它信息。
解决方案:
什么时候删除临时文件
解决方案:
引用18楼skyandcode的回复:

Quote: 引用13楼FoxDave的回复:
当然是你是否保存操作的最后啊。。。

如果用户没保存呢

没保存指什么?直接把浏览器关掉吗?
解决方案:
该回复于2015-01-21 23:29:13被版主删除
解决方案:
比较赞同sp1234的说法,设定一个时间,规定时间内未完成保存会被清理掉。在此,建议你再做一个手工清理文件的功能,查询和数据库中没有关联的文件列表或文件夹,在web上做删除。
解决方案:
引用24楼FoxDave的回复:

Quote: 引用18楼skyandcode的回复:
Quote: 引用13楼FoxDave的回复:
当然是你是否保存操作的最后啊。。。

如果用户没保存呢

没保存指什么?直接把浏览器关掉吗?

是的。
解决方案:
引用26楼xhbmj的回复:

比较赞同sp1234的说法,设定一个时间,规定时间内未完成保存会被清理掉。在此,建议你再做一个手工清理文件的功能,查询和数据库中没有关联的文件列表或文件夹,在web上做删除。

嗯。觉不觉得在登录时做清理是更好的选择?设定时清理还是可能存在垃圾文件,例如,服务器重启了,缓存失效了等等。
解决方案:
引用27楼skyandcode的回复:

Quote: 引用24楼FoxDave的回复:
Quote: 引用18楼skyandcode的回复:
Quote: 引用13楼FoxDave的回复:
当然是你是否保存操作的最后啊。。。

如果用户没保存呢

没保存指什么?直接把浏览器关掉吗?

是的。

关闭浏览器也能监听到,在那里处理呗正常页面上应该有取消按钮的吧,点取消删除文件
解决方案:
服务器启动一个定时任务不就可以了。如果不会弄。你可做一个网址。这个网址,交给XX网站监控(网上有很多这种免费的服务),他会定时访问这个网址。判断文件的最后写入日期,是否超过XX小时,就删除掉了
解决方案:
或者你也可以使用ActiveX或Flash控件上传,只有点击保存的时候才真正上传,否则在IE里浏览不过这样也没法保证不会上传到一半关闭IE
解决方案:
手动删除。。。。。。。。。。。。。。。。。。。。。。
解决方案:
这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹
解决方案:
文件先上传到一个临时文件夹中,定时删除临时文件夹,如果保存,则复制文件并删除文件,就解决了因关闭浏览器不保存的问题
解决方案:
忘记了说,如果你需要定时删除程序,这里有个类可以方便实现http://www.wuyinweb.com/doc/52/23.aspx
解决方案:
引用33楼Z65443344的回复:

这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹

感谢所有朋友的回答。采用了这位朋友的建议。
解决方案:
引用36楼skyandcode的回复:

Quote: 引用33楼Z65443344的回复:
这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹

感谢所有朋友的回答。采用了这位朋友的建议。

这个方法有个bug,如果当前时间是23:59分,一个用户上传了文件还没保存,24点之后就是第二天了,此时另一个用户开始上传,按楼上的方法就会把昨天的临时文件夹删除,也就是前一个用户一分钟前上传的文件全被删除了,而他还没来得及保存呢
解决方案:
引用37楼webdiyer的回复:

Quote: 引用36楼skyandcode的回复:
Quote: 引用33楼Z65443344的回复:
这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹

感谢所有朋友的回答。采用了这位朋友的建议。

这个方法有个bug,如果当前时间是23:59分,一个用户上传了文件还没保存,24点之后就是第二天了,此时另一个用户开始上传,按楼上的方法就会把昨天的临时文件夹删除,也就是前一个用户一分钟前上传的文件全被删除了,而他还没来得及保存呢

对的不能用这种方式如果你在CSDN编辑回帖后没有点击“提交回复”那么你退出后重新登录再打开该贴就会发现刚刚编辑的内容还在要么等用户自己删除要么设计时间点到点删除(是删除临时文件)或者弄个已/未上传标志貌似要动动表字段或者干脆按时间段来过了时间都眉毛胡子一把删除临时文件
解决方案:
引用37楼webdiyer的回复:

Quote: 引用36楼skyandcode的回复:
Quote: 引用33楼Z65443344的回复:
这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹

感谢所有朋友的回答。采用了这位朋友的建议。

这个方法有个bug,如果当前时间是23:59分,一个用户上传了文件还没保存,24点之后就是第二天了,此时另一个用户开始上传,按楼上的方法就会把昨天的临时文件夹删除,也就是前一个用户一分钟前上传的文件全被删除了,而他还没来得及保存呢

嗯,的确是会出现这种情况。我是想设定一个特殊的时间,例如05:00:00保证这种概率尽可能低。像你上面的说法,是需要去数据库查询,我这边尽量不改表结构。而且,用户如果打开多个页面同时在上传呢?你觉得呢?
解决方案:
引用38楼tongxuejie的回复:

Quote: 引用37楼webdiyer的回复:
Quote: 引用36楼skyandcode的回复:
Quote: 引用33楼Z65443344的回复:
这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹

感谢所有朋友的回答。采用了这位朋友的建议。

这个方法有个bug,如果当前时间是23:59分,一个用户上传了文件还没保存,24点之后就是第二天了,此时另一个用户开始上传,按楼上的方法就会把昨天的临时文件夹删除,也就是前一个用户一分钟前上传的文件全被删除了,而他还没来得及保存呢

对的不能用这种方式如果你在CSDN编辑回帖后没有点击“提交回复”那么你退出后重新登录再打开该贴就会发现刚刚编辑的内容还在要么等用户自己删除要么设计时间点到点删除(是删除临时文件)或者弄个已/未上传标志貌似要动动表字段或者干脆按时间段来过了时间都眉毛胡子一把删除临时文件

设计每日定时删除的确会有问题,只能说概率较小。如果是定时删除,那可能要在服务器启动时,完全清理临时文件,不然用户上传过程,如果服务器重启了,就存在垃圾文件了。如果是定时删除,是不是按以下的做法:用户上传,缓存上传成功后的路径,这个缓存2小时后被移除。也就是依赖缓存了。这样会不会有效率问题?
解决方案:
删除已经上传到数据库和文件夹中的图片文件protectedvoidGridView1_RowDeleting(objectsender,GridViewDeleteEventArgse){stringsqlVideoPicture="selectImagesfromtb_HuenLianwhereHenuID="+gvBlog.DataKeys[e.RowIndex].Value.ToString();//删除指定路径下的图片File.Delete(Server.MapPath("../")+operateData.getTier(sqlVideoPicture));SqlDatada=newSqlData();da.ExceSQL("deletefromtb_HuenLianwhereHenuID='"+gvBlog.DataKeys[e.RowIndex].Value+"'");//删除数据表中的图片地址da.ExceSQL("deletefromtb_huen_lianwherehID='"+gvBlog.DataKeys[e.RowIndex].Value+"'");//删除数据表中的图片地址Response.Redirect("UserManage.aspx");}//codego.net/15/1/1///询问对话框提示protectedvoidgvBlog_RowDataBound(objectsender,GridViewRowEventArgse){if(e.Row.RowType==DataControlRowType.DataRow){((LinkButton)(e.Row.Cells[5].Controls[0])).Attributes.Add("onclick","returnconfirm('确定删除吗?')");}}
解决方案:
引用41楼laohu_laohu的回复:

删除已经上传到数据库和文件夹中的图片文件protectedvoidGridView1_RowDeleting(objectsender,GridViewDeleteEventArgse){stringsqlVideoPicture="selectImagesfromtb_HuenLianwhereHenuID="+gvBlog.DataKeys[e.RowIndex].Value.ToString();//删除指定路径下的图片File.Delete(Server.MapPath("../")+operateData.getTier(sqlVideoPicture));SqlDatada=newSqlData();da.ExceSQL("deletefromtb_HuenLianwhereHenuID='"+gvBlog.DataKeys[e.RowIndex].Value+"'");//删除数据表中的图片地址da.ExceSQL("deletefromtb_huen_lianwherehID='"+gvBlog.DataKeys[e.RowIndex].Value+"'");//删除数据表中的图片地址Response.Redirect("UserManage.aspx");}//codego.net/15/1/1///询问对话框提示protectedvoidgvBlog_RowDataBound(objectsender,GridViewRowEventArgse){if(e.Row.RowType==DataControlRowType.DataRow){((LinkButton)(e.Row.Cells[5].Controls[0])).Attributes.Add("onclick","returnconfirm('确定删除吗?')");}}

看题。
解决方案:
引用9楼sp1234的回复:

既然“保存”时就是“将文件路径写入数据库”的动作,那么你其实本可以准确知道文件有没有保存。你只是要判断多长时间算是“超时未保存”就行了。但是你后来纠结于“服务器程序不是自己可动手写的”、“不同上传时文件名会重复”的问题,那么你的其它干扰性的问题就“太多了”。你还是先搞明白哪一个先要在这个问题之前去搞明白吧,

请教sp1234,如果为每个上传文件保存2个小时,那就要缓存这个文件路径,设定2小时后删除这个缓存,然后删除文件。也就是依赖缓存了。这样会不会有效率问题?也就是说,如果有100个用户在这段时间内上传文件,那就要监视这100个路径了。感谢你的回答。
解决方案:
引用39楼skyandcode的回复:

Quote: 引用37楼webdiyer的回复:
Quote: 引用36楼skyandcode的回复:
Quote: 引用33楼Z65443344的回复:
这种临时文件夹,你完全可以每天生成一个,而不是所有临时文件都放到同一个文件夹里去至于什么时候生成,你可以让网站定时每天0点生成,也可以等每天第一个用户登陆的时候生成然后生成的同时就删除前一天的文件夹

感谢所有朋友的回答。采用了这位朋友的建议。

这个方法有个bug,如果当前时间是23:59分,一个用户上传了文件还没保存,24点之后就是第二天了,此时另一个用户开始上传,按楼上的方法就会把昨天的临时文件夹删除,也就是前一个用户一分钟前上传的文件全被删除了,而他还没来得及保存呢

嗯,的确是会出现这种情况。我是想设定一个特殊的时间,例如05:00:00保证这种概率尽可能低。像你上面的说法,是需要去数据库查询,我这边尽量不改表结构。而且,用户如果打开多个页面同时在上传呢?你觉得呢?

不修改数据库表结构也可以,文件的上传时间即创建时间可以直接从文件信息中获取,如创建时间早于多少小时就删除,否则不删除
解决方案:
遍历判断每个文件的创建时间效率太低了吧其实那个bug很好解决啊,就是今天不要删除昨天的,而是删除前天的,永远保留2天的文件夹,不就得了另外就是临时文件夹路径要保存在session里,不要上传文件上传到1号的文件夹,等保存的时候又去从2号的文件夹里取,那就出错了
解决方案:
用户点上传后保存到/temp/用户点保存后把文件从/temp/移到正式路径临时文件删除的问题,可以在Global写个定时任务去执行
解决方案:
引用45楼Z65443344的回复:

遍历判断每个文件的创建时间效率太低了吧其实那个bug很好解决啊,就是今天不要删除昨天的,而是删除前天的,永远保留2天的文件夹,不就得了另外就是临时文件夹路径要保存在session里,不要上传文件上传到1号的文件夹,等保存的时候又去从2号的文件夹里取,那就出错了

好久没来csdn了。这个想法是很不错。只不过还是有点问题。如果在webapp里实现,那么定时任务可以用Timer,但Timer会因为iis回收而被清掉。除非麻烦点在部署一个windowsservice。
解决方案:
定时任务会有问题的。见上。
解决方案:
关于这个问题,像sp1234说的,暂存2个小时,没保存就删除。这个想法是很好的,只是,怎么计时呢?而且,还有服务器重启等问题。现在我的想法是,存储一个标记在cookie,通过检查这个cookie是否需要去清理个人临时文件。

时间: 2024-08-26 01:44:40

上传问题,如何在用户没有保存时删除已上传文件的相关文章

source insight 保存时删除多余空格,去除多余空格 space tab键【转】

转自:http://blog.csdn.net/lanmanck/article/details/8638391 上传源码时最好把空格行去掉,以前介绍了使用notepad++,现在发现,习惯用source insight的人士也可以很easy的去掉了: Options->Perferences->Files-> Remove extra white space when saving.保存时自动去除每行尾部的空格和tab.   以下是另一个兄弟的心得: http://blog.csdn.

java-如何在JSP中将canvas保存为图片然后上传到servlet

问题描述 如何在JSP中将canvas保存为图片然后上传到servlet java MVC入门选手, 用canvas在JSP中设计了一个画板,想把用户画在画板上的画保存为图片然后上传到servlet,之前尝试先通过canvas.toDataURL()转为base64格式,然后用form提交到servlet,但不知道servlet该怎么收···代码如下,求大神指教 JSP代码 <input id="imgurl" type="button" value=&quo

ios-如何把移动客户端的用户数据保存到服务器上?

问题描述 如何把移动客户端的用户数据保存到服务器上? 开发一个iOS app 想把用户注册后的头像.昵称.密码等信息保存到服务器上,请问怎么做啊?哪里弄服务器啊?我没接触过服务器,但你们直说无妨,我可以一一去学 解决方案 学习一门web开发语言/技术,比如java/jsp或者php或者c#/asp.net等.编写一个服务器端,完成接收数据存入数据库的任务. 至于服务器,你可以租用一个云服务器,每个月几十元,也可以拿你自己的电脑作为服务器,但是前提是你的计算机有一个公网的ip地址. 解决方案二:

java读取用户登入退出日志信息上传服务端_java

本文实例为大家分享了读取用户登入出日志并上传服务端的具体实现代码,供大家参考,具体内容如下 该客户端运行在给用户提供unix服务的服务器上.用来读取并收集该服务器上用户的上下线信息,并进行配对整理后发送给服务端汇总. 具体实现代码: 1. DMSServer.java package com.dms; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.i

C#实现图片上传(PC端和APP)保存及 跨域上传说明_C#教程

A-PC端: 1-页面--multiple是控制单张还是多张图片上传 <input id="BusRoute" type="file" class="btn btn-default btn-lg" style="height:34px;padding-top:5px;padding-bottom:5px;" multiple /> 2-后台获取图片文件: HttpFileCollection pcFileColl

二进制-html表单上传file,php获取然后保存到数据库中,类型blob

问题描述 html表单上传file,php获取然后保存到数据库中,类型blob <form action="../php/teest.php" method="post"> <input type="file" name="pic"/> <input type="submit" value="提交"/> </form> php: requi

上传后,获取request.getInputStream()来保存到本地

问题描述 上传后,获取request.getInputStream()来保存到本地 用的webuploader上传,后台通过request.getInputStream();怎么把这个上传的内容 保存到本地上, 试了一些方法,打开的图片不全,只能显示一点. 解决方案 把他再用outputstream写出到本地

c#做网站时。。注册新用户时,同时上传个人形象照??

问题描述 c#做网站时..注册新用户时,同时上传个人形象照??并显示啊..菜鸟急求解 解决方案 解决方案二:首先注册用户的时候要让用户上传照片,插入数据的时候把照片在服务器上的相对路径存入数据库,显示的时候把路径取出来赋值给图片控件.解决方案三:能不能说具体点啊..其它的我都做好了,,就是不能看到图片啊...解决方案四:那个我是这样做的:首先有一个头像控件与一个点击上传的按钮:<asp:ImageID="ImageMyhead"name="ImageMyhead&quo

file zilla上传文件时退出之前已上传的照片会被保存吗?急求

问题描述 filezilla上传文件时退出之前已上传的照片会被保存吗? 解决方案 解决方案二:会的吧,只不过这个文件可能不完整.解决方案三:是什么样的不完整,打不开?