0%

文件上传

无论是文件的上传还是下载,都是IO操作,无非是一边读取文件,一边写入文件。
文件的上传不一样是他无法通过GET方式提交,所以只能由表单使用POST方式提交,并且申明:

1
2
<form action="${pageContext.servletContext.contextPath}/UploadServlet" method="post"
enctype="multipart/form-data">

我们有非常棒的第三方工具,导入两个jar包。

1:获取要使用的对象

1
2
3
4
5
6
// 1创建工厂对象
DiskFileItemFactory factory=new DiskFileItemFactory();
// 2创建解析器对象
ServletFileUpload upload=new ServletFileUpload(factory);
// 3解析器转化请求
List<FileItem> fileItems = upload.parseRequest(request);

2:使用对象

1
2
3
4
5
6
7
8
9
10
11
12
for(FileItem item :fileItems) {// 获取用户提交的用户名  普通表单项  type=text password
if(item.isFormField()){//true:普通的表单项
//item.getFieldName():<input type="" name=""/>获取表单项的name属性值
//getString():当前这个表单项提交的数据
System.out.println(item.getFieldName()+"提交的数据是:"+item.getString());
}else {//获取用户提交图片 文件域 type=file
//getName():获取文件域上次文件实际的名称
String savePath=getServletContext().getRealPath("/WEB-INF/upload/"+item.getName());//获取指定目录在服务器上的绝对路径
File os=new File(savePath);
//实现实际文件保存
item.write(os);
}

3:其他的常见问题解决

文件上传大小限制:

1
2
//设置单个文件上传的大小
upload.setFileSizeMax(4*1024*1024);//如果单个文件超过4m,抛出500的异常

中文乱码:

1
2
3
4
//解决上传文件中文乱码的问题
response.setCharacterEncoding("utf-8");
//如果以上代码不能处理中文乱码,可以在getString()时再处理
fileItem.getString("utf-8")

重名问题:

1
2
3
// 1:使用随机数,随机函数,当前时间戳,毫秒值等随机参数
// 2:获取文件名后缀(如.jpg等)
// 3:拼接新文件名=1+2(随机参数.后缀名)

文件格式问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1:准备一些服务器能接受的格式,存入数组或集合
// 2:取出上传文件的后缀名,即格式(文件名字符串取最后一个.后面的内容)
// 3:查看2是否与1中的任意一款匹配,如果都没有匹配上,格式错误

// 参考代码
String fileFullName = item.getName();//提交上传文件的全名
//获取文件后缀名
String lastName = fileFullName.substring(fileFullName.lastIndexOf("."));
//限制文件格式:jpg jpeg png....
String[] rightLastName={"jpg","jpeg","gif","bmp"};
//文件是否合法
boolean isOk=false;//默认不合法
for(String name:rightLastName){
if(fileFullName.toLowerCase().endsWith(name)){
isOk=true;// 如果匹配到,文件格式合法
}
}