整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务

一客户端

先看最基本的情况

1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的。服务器更多的是对应这个例子。

 jsp文件上传

但有以下问题

一般的Ajax无法把附件数据发过去

附件往往涉及比较多问题,比如上传需要时间(要有个进度),上传也有可能不成功等,上传需要校验的东西就比较多。

 

2于是就有把上传分开来自己执行的。上传项在浏览文件后就开始上传,其他表单数据在提交表单时再提交。

 jsp文件上传

更详细地说是:上传在表单中有自成一体的界面,浏览后点击上传开始上传(也可以是其他形式),以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

 

二服务端

客户端怎么做在服务端的接口都是一样的。都是面对着这么一个表单,表单里有一些字段,还有一个到多个的上传附件。

 jsp文件上传

纵观附件的管理,业务流程是这样的

 jsp文件上传

上传要处理的问题

附件重名处理

上传类型检查、大小等限制

上传文件的位置规划

文件夹及安全性

附件数据库

编码问题

 

上传方案

1最基本,用request的inputstream读写

2用组件库,common-fileupload(例子里用了这个),这些组件库对request进行封装。

3用struct提供的上传功能

 

例子中的处理过程

用common-uploadfile,需要以下包。自己写了一个工具类,改进自

http://lohasle.iteye.com/blog/1604428

 jsp文件上传

上传文件夹放在网站根目录,可以用工具类把所有附件都传到一个目录,也可以按表单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>
View Code

相关文章: