servlet文件上传

原创 2015年07月07日 23:31:58


2014年9月8日 16:27:56


一、文件上传的原理
1、文件上传的前提
a、form表单的method必须是post
b、form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的数据类型)
注意:当表单的enctype是multipart/form-data,传统的获取请求参数的方法失效。
请求正文:(MIME协议进行描述的,正文是多部分组成的)
-----------------------------7dd32c39803b2
Content-Disposition: form-data; name="username"

wzhting
-----------------------------7dd32c39803b2
Content-Disposition: form-data; name="f1"; filename="C:\Documents and Settings\wzhting\妗岄潰\a.txt"
Content-Type: text/plain

aaaaaaaaaaaaaaaaaa
-----------------------------7dd32c39803b2
Content-Disposition: form-data; name="f2"; filename="C:\Documents and Settings\wzhting\妗岄潰\b.txt"
Content-Type: text/plain

bbbbbbbbbbbbbbbbbbb
-----------------------------7dd32c39803b2--

c、form中提供input的type是file类型的文件上传域


二、利用第三方组件实现文件上传
1、commons-fileupload组件:
jar:commons-fileupload.jar 
                         commons-io.jar

2、核心类或接口
DiskFileItemFactory:设置环境
public void setSizeThreshold(int?sizeThreshold) :设置缓冲区大小。默认是10Kb。
当上传的文件超出了缓冲区大小,fileupload组件将使用临时文件缓存上传文件
public void setRepository(java.io.File repository):设置临时文件的存放目录。默认是系统的临时文件存放目录。
ServletFileUpload:核心上传类(主要作用:解析请求的正文内容)
boolean isMultipartContent(HttpServletRequest?request):判断用户的表单的enctype是否是multipart/form-data类型的。
List parseRequest(HttpServletRequest request):解析请求正文中的内容
setFileSizeMax(4*1024*1024);//设置单个上传文件的大小
upload.setSizeMax(6*1024*1024);//设置总文件大小
FileItem:代表表单中的一个输入域。
boolean isFormField():是否是普通字段
String getFieldName:获取普通字段的字段名
String getString():获取普通字段的值
InputStream getInputStream():获取上传字段的输入流
String getName():获取上传的文件名

三、文件上传中要注意的9个问题
1、如何保证服务器的安全
把保存上传文件的目录放到WEB-INF目录中。
2、中文乱码问题
2.1普通字段的中文请求参数
String value = FileItem.getString("UTF-8");
2.2上传的文件名是中文
解决办法:request.setCharacterEncoding("UTF-8");
3、重名文件被覆盖的问题
System.currentMillions()+"_"+a.txt(乐观)
UUID+"_"+a.txt:保证文件名唯一
4、分目录存储上传的文件
方式一:当前日期建立一个文件夹,当前上传的文件都放到此文件夹中。
方式二:利用文件名的hash码打散目录来存储。
int hashCode = fileName.hashCode();
1001 1010 1101 0010 1101 1100 1101 1010
hashCode&0xf;   0000 0000 0000 0000 0000 0000 0000 1111 &
---------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1010   取hashCode的后4位
0000~1111:整数0~15共16个
1001 1010 1101 0010 1101 1100 1101 1010
(hashCode&0xf0) 0000 0000 0000 0000 0000 0000 1111 0000  &
--------------------------------------------
0000 0000 0000 0000 0000 0000 1101 0000  >>4
--------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1101
0000~1111:整数0~15共16个
5、限制用户上传的文件类型
通过判断文件的扩展名来限制是不可取的。
通过判断其Mime类型才靠谱。FileItem.getContentType();
6、如何限制用户上传文件的大小
6.1单个文件大小限制。超出了大小友好提示
抓异常进行提示:org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException
6.2总文件大小限制。超出了大小友好提示
抓异常进行提示:org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException
7、临时文件的问题
commons-fileupload组件不会删除超出缓存的临时文件。
FileItem.delete()方法删除临时文件。但一定要在关闭流之后。
8、多个文件上传时,没有上传内容的问题
if(fileName==null||"".equals(fileName.trim())){
continue;
}
9、上传进度检测
给ServletFileUpload注册一个进度监听器即可,把上传进度传递给页面去显示
//pBytesRead:当前以读取到的字节数
//pContentLength:文件的长度
//pItems:第几项
public void update(long pBytesRead, long pContentLength,
int pItems) {
System.out.println("已读取:"+pBytesRead+",文件大小:"+pContentLength+",第几项:"+pItems);

2014年9月8日 16:27:56


一、文件上传的原理
1、文件上传的前提
a、form表单的method必须是post
b、form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的数据类型)
注意:当表单的enctype是multipart/form-data,传统的获取请求参数的方法失效。
请求正文:(MIME协议进行描述的,正文是多部分组成的)
-----------------------------7dd32c39803b2
Content-Disposition: form-data; name="username"

wzhting
-----------------------------7dd32c39803b2
Content-Disposition: form-data; name="f1"; filename="C:\Documents and Settings\wzhting\妗岄潰\a.txt"
Content-Type: text/plain

aaaaaaaaaaaaaaaaaa
-----------------------------7dd32c39803b2
Content-Disposition: form-data; name="f2"; filename="C:\Documents and Settings\wzhting\妗岄潰\b.txt"
Content-Type: text/plain

bbbbbbbbbbbbbbbbbbb
-----------------------------7dd32c39803b2--

c、form中提供input的type是file类型的文件上传域


二、利用第三方组件实现文件上传
1、commons-fileupload组件:
jar:commons-fileupload.jar 
                         commons-io.jar

2、核心类或接口
DiskFileItemFactory:设置环境
public void setSizeThreshold(int?sizeThreshold) :设置缓冲区大小。默认是10Kb。
当上传的文件超出了缓冲区大小,fileupload组件将使用临时文件缓存上传文件
public void setRepository(java.io.File repository):设置临时文件的存放目录。默认是系统的临时文件存放目录。
ServletFileUpload:核心上传类(主要作用:解析请求的正文内容)
boolean isMultipartContent(HttpServletRequest?request):判断用户的表单的enctype是否是multipart/form-data类型的。
List parseRequest(HttpServletRequest request):解析请求正文中的内容
setFileSizeMax(4*1024*1024);//设置单个上传文件的大小
upload.setSizeMax(6*1024*1024);//设置总文件大小
FileItem:代表表单中的一个输入域。
boolean isFormField():是否是普通字段
String getFieldName:获取普通字段的字段名
String getString():获取普通字段的值
InputStream getInputStream():获取上传字段的输入流
String getName():获取上传的文件名

三、文件上传中要注意的9个问题
1、如何保证服务器的安全
把保存上传文件的目录放到WEB-INF目录中。
2、中文乱码问题
2.1普通字段的中文请求参数
String value = FileItem.getString("UTF-8");
2.2上传的文件名是中文
解决办法:request.setCharacterEncoding("UTF-8");
3、重名文件被覆盖的问题
System.currentMillions()+"_"+a.txt(乐观)
UUID+"_"+a.txt:保证文件名唯一
4、分目录存储上传的文件
方式一:当前日期建立一个文件夹,当前上传的文件都放到此文件夹中。
方式二:利用文件名的hash码打散目录来存储。
int hashCode = fileName.hashCode();
1001 1010 1101 0010 1101 1100 1101 1010
hashCode&0xf;   0000 0000 0000 0000 0000 0000 0000 1111 &
---------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1010   取hashCode的后4位
0000~1111:整数0~15共16个
1001 1010 1101 0010 1101 1100 1101 1010
(hashCode&0xf0) 0000 0000 0000 0000 0000 0000 1111 0000  &
--------------------------------------------
0000 0000 0000 0000 0000 0000 1101 0000  >>4
--------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1101
0000~1111:整数0~15共16个
5、限制用户上传的文件类型
通过判断文件的扩展名来限制是不可取的。
通过判断其Mime类型才靠谱。FileItem.getContentType();
6、如何限制用户上传文件的大小
6.1单个文件大小限制。超出了大小友好提示
抓异常进行提示:org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException
6.2总文件大小限制。超出了大小友好提示
抓异常进行提示:org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException
7、临时文件的问题
commons-fileupload组件不会删除超出缓存的临时文件。
FileItem.delete()方法删除临时文件。但一定要在关闭流之后。
8、多个文件上传时,没有上传内容的问题
if(fileName==null||"".equals(fileName.trim())){
continue;
}
9、上传进度检测
给ServletFileUpload注册一个进度监听器即可,把上传进度传递给页面去显示
//pBytesRead:当前以读取到的字节数
//pContentLength:文件的长度
//pItems:第几项
public void update(long pBytesRead, long pContentLength,
int pItems) {
System.out.println("已读取:"+pBytesRead+",文件大小:"+pContentLength+",第几项:"+pItems);

版权声明:本文为博主原创文章,未经博主允许不得转载。

servlet实现form表单的文件上传

该方法需要用到commons-fileupload-1.2.2.jar和commons-io-2.4.jar两个包,自行下载。
  • Steven_sf
  • Steven_sf
  • 2017年04月25日 10:07
  • 277

Servlet实现文件上传的原理

本文转自:http://www.ibm.com/developerworks/cn/java/fileup/ Servlet 是用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应...
  • lixiaoxiong55
  • lixiaoxiong55
  • 2016年06月15日 18:11
  • 4520

Servlet:实现多个文件上传,上传中文文件乱码解决办法

首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar,可百度下下载,然后你可能会遇到"ser...
  • ab6326795
  • ab6326795
  • 2013年09月05日 22:49
  • 2055

使用Servlet3.0上传文件

Servlet3.0支持HttpServletRequest对文件的上传,提供了两个方法: 1.Part getPart(String name):根据名称获取文件的上传域。 2.Collection...
  • Leafage_M
  • Leafage_M
  • 2017年01月15日 14:08
  • 967

servlet3 upload上传文件实践

一、javax.servlet.http中Part接口public interface Part 要上传文件必须使用multipart/form-data作为request body。版本: Se...
  • u010902721
  • u010902721
  • 2016年05月11日 21:04
  • 3540

Servlet 知识点(三) -- Servlet 的文件上传功能的表单获取问题(2)

上周用 smartUpload 因为性能的关系被无情抛弃了 , 百度了一波之后采用了 common-io 和 common-lang 的上传方式 . 对于表单传值 , 他们也有很好的解决办法//判断表...
  • JacXuan
  • JacXuan
  • 2017年06月28日 09:35
  • 6166

Servlet实现带进度条的文件上传

在上一篇博文中介绍了通过POST的方式上传文件:点击打开链接 ,这一篇文章将介绍如何实现带进度条的上传效果。 工作原理:上传文件的同时,Servlet将上传进度的信息例如文件总长度、已上传文件的多少、...
  • Joewin19911225
  • Joewin19911225
  • 2016年12月16日 20:35
  • 585

文件上传简单案例(后台Servlet处理)

简单文件上传案例,后台Servlet演示,fileupload组件实现
  • zhoumengshun
  • zhoumengshun
  • 2017年03月27日 21:59
  • 636

servlet+jsp实现的文件上传与下载

java文件上传与下载      通过微表单元苏设置Method = "post"      enctype = "multipart/form-data"属性,让表单提交的数据以二进制编码的方式...
  • wojiaohuangyu
  • wojiaohuangyu
  • 2016年03月21日 14:51
  • 8061

使用jsp/servlet简单实现文件上传与下载

使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马。好了,下面来简单了解如何通过使用...
  • Wetsion
  • Wetsion
  • 2016年03月14日 22:02
  • 5960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:servlet文件上传
举报原因:
原因补充:

(最多只允许输入30个字)