java web实现文件上传_JavaWeb开发之网站实现文件上传功能

一个功能完善的JavaWeb应用,必不可少的一个功能就是文件的上传。无论是用户的头像等,还是用户需要上传的一系列资料,都是通过文件的上传功能实现的。

目前我们实现网站中关于文件的上传功能时,常用的是apache的开源工具common-fileupload以及common-fileupload的依赖包common-io。

下面以一个注册页面的后台程序为例,大致讲解这两个包的使用:

首先,前往apache官网上面下载common-fileupload、common-io这两个包,并放入工程的WEB-INF文件夹的lib目录下。

然后,在网站页面的表单那里设置:

文件选择按钮为:

表单数据属性设置为:enctype="multipart/form-data"。因为只有使用enctype="multipart/form-data",表单才会把文件的内容编码到HTML请求中。

原理请移步:http://blog.csdn.net/mazhibinit/article/details/49667511 进行了解。

文件上传栏:

最后,在表单提交的目的jsp文件中使用两个包中的工具类进行文件的提取与保存,一般步骤如下:

1、实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload的一些基本设定。比如

DiskFileItemFactory dfif = newDiskFileItemFactory();//定义文件上传时的“运输船”大小。文件是一部分一部分上传的,这里设置为4K。当数据读取到4K则写入硬盘的临时文件夹中,清空运输船继续读取。

//文件传输完后,再从临时文件夹转存到实际的保存路径下

dfif.setSizeThreshold(4096);//设置存放临时文件的目录如下:获取完整路径——修改路径新建临时文件夹——把临时文件夹设为工厂的默认目录(则工厂获取的内容会默认存放在这里)

String realwebbase = request.getSession().getServletContext().getRealPath("/");

File temp_file = new File(realwebbase+"upload/UploadTemp");

if (!temp_file.exists()) {

temp_file.mkdirs();

}

dfif.setRepository(temp_file);

2、用工厂实例化上传组件,则该组件会使用该工厂实例的一系列配置(如:以多大容量为一次上传文件、临时文件存放处等)

ServletFileUpload sfu = newServletFileUpload(dfif);

sfu.setHeaderEncoding("UTF-8");//设置上传文件的最大容量

sfu.setSizeMax(MAX_SIZE);

3、从request对象中把上传内容提取到一个list中。从上面引用的博文处可以看到,POST+multipart/form-data的效果是form表单内的内容以键值对的形式提交上去。

List fileList = null;try{

fileList=sfu.parseRequest(request);

}catch (FileUploadException e) { }

4、用迭代器遍历list对象,提取上传内容。上传内容主要分两种:文本与非文本内容(图片、多媒体文件等)

Iterator fileItr =fileList.iterator();

while(fileItr.hasNext()) {

FileItem fileItem =(FileItem) fileItr.next();if(fileItem.isFormField()){ //第一种上传内容:普通文本,分别获取键名、值内容即可

String name =fileItem.getFieldName(); //获取键值对的键名

String value= fileItem.getString("UTF-8"); //此处的getString()是指对list的当前元素(键值对)的值,按照参数所指定的解码方式进行解析、获取内容}else{ //第二种上传内容:非文本,则需要用到流传输来把内容读取、保存到具体的路径下

String path =fileItem.getName(); //获取文件的路径名,用于截取扩展名进行文件类型的判断//得到文件的大小,用于判断文件大小是否合法

long size =fileItem.getSize();

if ("".equals(path) || size == 0) {

out.println("上传的文件无效!");out.close();return;

}//得到去除路径的文件名

String t_name = path.substring(path.lastIndexOf("/") + 1);//得到文件的扩展名(无扩展名时将得到全名)

String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); //遍历允许的扩展名数组,看看上传文件的扩展名是否合法。

int i = 0;

boolean errorflag=true;while (i

errorflag=false;break;

}

i=i+1;

}if (errorflag) {

out.println("请上传合法文件!");out.close();return;

}

//用uuid+日期作为文件名的一部分来唯一标识文件

String uuid =UUID.randomUUID().toString();

String today = new SimpleDateFormat("yyyyMMdd").format(newDate());//生成最终的文件保存完整路径:目录路径+日期+UUID+ . +扩展名

String u_name = realwebbase + "upload/" + today + "/" + uuid + "." +t_ext;try{

File _today_file = new File(realwebbase + "upload/Uploaded/" + _today); //构建文件目录

if (!_today_file.exists()) {

_today_file.mkdirs();

}

fileItem.write(newFile(u_name)); //把当前list元素的值用write流写到创建好的路径下,即实现文件内容的保存了return;

}catch(Exception e) {

e.printStackTrace();

}

}

5、最后,就是把文件的相对路径信息保存到数据库中去,使文件得以在其他文件中通过相对路径进行引用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值