如何优雅的文件上传

前言:java

  写给java入门的人,写给在职须要提升广度的人。web

  你须要有以下知识:json

    你要知道什么是数据流,浏览器到底都能干什么,java有哪些IO相关的操做类。servlet与运行服务器环境(tomcat,weblogic等)有什么关系。浏览器

  若是你没有上述知识点,不要紧,尽可能往下看,若是你知识为了工做须要。tomcat

  我会按照以下格式书写:服务器

    他们的实现是根据什么实现的,依赖什么,如何操做,最后会描述如何创建以个完整的项目中共通的文件上传功能。网络


 

  咱们的目标:session

    (没有蛀牙?)对于任何一条数据,应该有一个对应文件的扩展字段,而不是一套业务一套文件上传,换言之,一个文件上传的功能,须要适用于项目中全部的文件上传,如图:  blog

    

 

   这是咱们认为文件上传的一个简单的过程。事件

   第一步,咱们要在页面上直接上传文件到服务器,缘由是某些文件须要及时预览一下,又或者为了提升客户体验,有时候咱们会在一个表单中添加附件上床,更多的作法是,当用户选择一个文件以后,旁边有一个上传按钮,点击上传按钮,开始出现进度条,当进度条完成以后,客户开始继续填写表单,然而对于web开发,实时显示上传进度是很是不简单的事情,好比你可能须要flash的帮助,然而H5的世界说,flash正在被人类抨击。so,你肯让最终显示的是一个等待界面而已,无论如何,咱们应该让用户先看到文件上传的等待,而不是最终一并提交,而且上传,由于这个过程颇有可能出现问题,好比网络错误,服务器BUG,用户误操做等.....

  由于有了预先上传这个过程,最后用户可能获取到这个文件在服务器上的数据ID,便可进行提交,甚至你可让用户填写表单到一半的时候继续填写,不用再次上传附件。

  一个典型的demo,就是aliyun 的备案(好吧,你说是万网的我也无话可说),当你的扫描件上传以后,关掉页面,下次进来是不须要你再次上传的,由于这已是属于你的资源。


 

  第二步,咱们须要根据业务来控制数据在服务器的位置,以及其余属性,一般,咱们会把文件第一次上传到服务器上的一个临时存储目录,缘由以下:

      1.你不能直接肯定这个文件须要用在什么地方,由于你的文件上传多是公用的,申报须要,注册须要,甚至后台管理也须要,因此你要有一个临时目录,什么文件都方进去,等知道这个文件是干吗的以后,再移动出去。就比如新兵蛋子跟后期筛选同样。

      2.你可能最终不须要用这个文件,他是个垃圾,他不过是一些傻逼浪荡的用户上传的垃圾附件,上传完了,就完了,根本没提交表单(别骂人家,你也干过。)

      3.若是你的上传是共用的,那么若是你一开始就把文件上传到目标文件夹下面,或者其余什么文件系统下面,会很麻烦。(不解释)


 

  第三步,你须要让用户操做这个文件了,一般,这个文件上传以后会返回客户端一个文件ID,最终用户只是提交了这样一个文件ID,并非提交表单的时候同时上传附件。so,问题来了,万一上传的附件错了,从新上传怎么办?万一上传的附件。。。问题太多,咱们写个FAQ

      FAQ:

    • 上传错了,又点上传,怎么办?  
      服务器在每一次接收上传的时候,至少要保存【业务标记】【操做用户】【文件状态】,若是在当前业务下,该用户已经拥有一个临时文件,那么应该删掉本来文件,上传新的文件,使用以前的附件ID返回客户端;若是没有,那么直接上传新附件,而且生成附件数据ID,返回给客户端。保证用户在一个业务下只有一个临时文件。这里说的业务一般是一个表单字段,甚至是一个字段中的一个节点,好比注册用户,须要身份证反正面上传,这个时候可能反正面的附件ID,在同一个字段,如“cid_ufile_id_json”,他多是一个json格式的字段,用来存储用户上传的身份验证附件。

    • 上传后没有使用,直接关掉浏览器了?  
            首先这不是个事,由于一般咱们的项目,都会监听session关闭事件(多嘴一句,并非浏览器关掉就会session销毁,这须要浏览器想服务器发送通知的,若是直接断电,颇有可能没有这个通知。)你须要在session关闭的时候去清理session给服务器带来的垃圾。就好像你家客人走了以后你要收拾卫生同样。(这跟你背着你老婆找野女人不同!!!!)若是是断电呢,不能及时清理,或者服务器就会有垃圾,无论什么缘由,服务器颇有可能存在一些“你觉得”清理掉的垃圾,OK,作个corn定时清理下吧,这就是为何刚才说每一个文件数据都要有文件状态,他至少要有几种状态【临时态】,【完成态】,【垃圾态】。
            当用户session关闭,或者上传新的附件以后,不要直接去清理刚才的垃圾,你能够试着把他标记为【垃圾】,晚上服务器作清理(就好像咱们早上拉大便同样)的时候进行清理,这个好像叫什么来的?(扫描-标记,字眼熟悉吗?看看think in java,题外话,这就是看这些书有啥用,记住他的实现机制一点用没有,然而拿出来用在别的地方才是真的)。
    • 我怎么让客户端显示等待画面?
      面对这种问题,我只能说“凑,你想怎么弄我怎么知道,看心情”
    • 垃圾

 

 

 

 

 

 

 

 

 

 

 

 

 

待续

相关文章
相关标签/搜索