apache实现文件上传服务器,使用Apache的Fileupload工具实现文件上传

Apache Fileupload 是一个用于处理HTTP请求中文件上传的工具。本文详细介绍了如何使用DiskFileItemFactory和ServletFileUpload类来解析上传数据,以及FileItem的相关API,包括判断是否为普通表单项、获取字段名、值、文件名、大小等。同时,文章讨论了文件上传过程中的注意事项,如保存地址、文件名处理、文件名乱码、文件同名问题和大小限制。还提供了一个实战示例,展示了如何在Spring MVC中处理文件上传请求,并给出了源码分析。
摘要由CSDN通过智能技术生成

这个小组件,它会帮我们解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中。我们只需要调用FileItem的方法即可。

Maven依赖

commons-fileupload

commons-fileupload

1.3.2

相关类

工厂:DiskFileItemFactory

解析器:ServletFileUpload

表单项:FileItem

上传三大步

创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();

创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);

使用解析器解析request:List fileItemList = sfu.parseRequest(request);

FileItem API

boolean isFormField();// 是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!

String getFieldName();// 返回当前表单项的名称;

String getString(String charset);// 返回表单项的值;

String getName();// 返回上传的文件名称

long getSize();// 返回上传文件的字节数

InputStream getInputStream();// 返回上传文件对应的输入流

void write(File destFile);// 把上传的文件内容保存到指定的文件中。

String getContentType();

需要注意的一些上传细节

保存地址

上传到服务器的地址最好是在WEB-INF下,因为这个目录浏览器是访问不到的

文件名称相关问题

有的浏览器上传的文件名是绝对路径,这需要切割!C:\files\baibing.jpg

String filename = fi2.getName();

int index = filename.lastIndexOf("\\");

if(index != -1) {

filename = filename.substring(index+1);

}

文件名乱码或者普通表单项乱码:request.setCharacterEncoding("utf-8");因为fileupload内部会调用request.getCharacterEncoding(); > request.setCharacterEncoding("utf-8");//优先级低servletFileUpload.setHeaderEncoding("utf-8");//优先级高

文件同名问题;我们需要为每个文件添加名称前缀,这个前缀要保证不能重复。uuid > filename = CommonUtils.uuid() + "_" + filename;

目录打散

不能在一个目录下存放之多文件:

首字符打散:使用文件的首字母做为目录名称,例如:abc.txt,那么我们把文件保存到a目录下。如果a目录这时不存在,那么创建之;

时间打散:使用当前日期做为目录;

哈希打散:1. 通过文件名称得到int值,即调用hashCode();2. 它int值转换成16进制0~9, A~F;3. 获取16进制的前两位用来生成目录,目录为二层!例如:1B2C3D4E5Fÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值