整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务
一客户端
先看最基本的情况
1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的。服务器更多的是对应这个例子。
但有以下问题
一般的Ajax无法把附件数据发过去
附件往往涉及比较多问题,比如上传需要时间(要有个进度),上传也有可能不成功等,上传需要校验的东西就比较多。
2于是就有把上传分开来自己执行的。上传项在浏览文件后就开始上传,其他表单数据在提交表单时再提交。
更详细地说是:上传在表单中有自成一体的界面,浏览后点击上传开始上传(也可以是其他形式),以ajax方式发送。发送在界面显示上传状态,并把file类型的控件的值置空。在提交表单时,仅提交其他数据。
3在表单一次性的提交的,但是用了ajax。这种我没做通,但想想这种在现实中很少需要就没做了。
之后就说说一种可行的实现,使用了jquery file Upload。
Jquery file Upload(鉴于官方文档不是一般的乱,整理了一下关键的页面):
Hello world:http://bbs.9ria.com/thread-245293-1-1.html
官方文档:https://github.com/blueimp/jQuery-File-Upload/wiki
Option:https://github.com/blueimp/jQuery-File-Upload/wiki/Options
关于使用思路(不关注jquery file Upload可以跳过):
首先我比较关注上传的js部分,所以没去了解界面的部分。jquery file Upload应该是界面做得最好的。就上传插件而言,基本思路应该是先配置插件的option,之后触发文件上传(怎么触发就是掌握不同插件的关键)
jquery file Upload在这一点比较奇葩,它是默认点击input就自动上传的。它可以把上传触发绑定到一个事件上,通过add这个option来配置。但这其实是有问题的,比如表单有两个上传域,希望通过某按键的click事件触发上传,click事件的处理就会被调用两次。结论很简单,用jquery file Upload,不要把多个文件的上传绑在一起,让他们各自完成。
jquery file Upload每次只会像服务器发一个文件,开始我也非常疑惑。但后来发现其他插件也是这样的。还是上面的一条,让每个上传各自完成。
其他好用的上传插件还有
Plupload:功能上最强,有校验,上传多个,拖拽上传等功能。(file类型域不是自己写的,通过指定一个button,由它的点击事件生成,通过调函数来开始上传)
文档:http://www.cnblogs.com/2050/p/3913184.html#plupload_doc4
Demo:http://chaping.github.io/plupload/demo/index.html
二服务端
客户端怎么做在服务端的接口都是一样的。都是面对着这么一个表单,表单里有一些字段,还有一个到多个的上传附件。
纵观附件的管理,业务流程是这样的
上传要处理的问题:
附件重名处理
上传类型检查、大小等限制
上传文件的位置规划
文件夹及安全性
附件数据库
编码问题
上传方案
1最基本,用request的inputstream读写
2用组件库,common-fileupload(例子里用了这个),这些组件库对request进行封装。
3用struct提供的上传功能
例子中的处理过程
用common-uploadfile,需要以下包。自己写了一个工具类,改进自
http://lohasle.iteye.com/blog/1604428
上传文件夹放在网站根目录,可以用工具类把所有附件都传到一个目录,也可以按表单filedname配置上传的位置。
上传的文件会以一个随机的名字保存,避免了附件重名。
用MineType检查文件类型,查询minetype可点击
http://www.cnblogs.com/newcj/archive/2011/08/10/2134305.html
先把文件传到一个临时文件夹,用fileItem对象读取文件信息,再重命名为随机名,传到指定文件夹。
fileUpload几个要注意的问题
fileUpload关键就是使用FileItem类,可以查文档
文件名,内容乱码:http://zsw4522006.iteye.com/blog/1470949
首先文件在上传和下载过程中是按字节传的,编码由文件本身保存所以不会乱码。
但文件名会有乱码,fileItem的getString也会有乱码,则主要是fileUpload默认的和现实的编码不一样。
common-fileupload对request进行封装,一旦我们按流的方式打开http请求,就不能用getParameter方法,而要用common-fileupload提供的接口访问表单
下载、删除和使用
当把“上传文件的位置规划”和“数据库存储”解决,后面的问题就差不多了。毕竟文件已经在那里了,它的信息也详细记录在数据库。实现详见代码
最后上代码
无ajax的附件表单,UploadAddInput.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 11 <title>上传文件</title> 12 </head> 13 14 <body> 15 16 <form name="upform" action="UploadAdd.jsp" method="POST" enctype="multipart/form-data"> 17 <input type ="text" name="name"/><br/> 18 <input type ="file" name="file1"/><br/> 19 <input type ="file" name="file2"/><br/> 20 <input type="submit" value="Submit" /><br/> 21 <input type="reset" /> 22 </form> 23 24 </body> 25 </html>