JAVAWEB学习文章索引点这里
文件上传需要注意的地方:
1,表单类型需要设置为post类型
2,表单提交方式为input标签 type=”file”
3,from标签的enctype属性需要设置为”mutipart/form-data”
4,如果上传文件比较单一的话可以手写上传方式,这里使用的是apache的上传工具包,需要导包commons-fileupload.jar和commons-io.jar
上传的时候会让你指定缓冲区大小和缓冲目录,如果上传文件大小小于缓冲区大小则直接上传,否则在缓冲区会创建缓冲文件。
由于将表单enctype属性需要设置为”mutipart/form-data”,所以普通属性的提交也会受到影响,在这里会被工具包同样封装到list集合中,在取出的时候先判断其是属性还是文件
这里的上传实现的功能有:
1,文件缓冲大小,缓冲区设置
2,文件名编码设置为utf-8
3,单个文件大小和多个文件大小限制
4,文件上传进度监听器
5,处理普通表单属性
6,文件上传类型限制
7,通过UUID算法避免重复名
8,文件保存和缓冲区缓冲文件删除
jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<font color="red"> ${msg } </font>
<%--1.提交方式必须是post,并且post方式才会有content-type属性
2.提交必须要有<input type="file">
3.表单enctype需要设置为multipart/form-data
--%>
<form method="post" action="FileUpload1" enctype="multipart/form-data">
请选择文件:<input type="file" name="file1"/><br/>
请选择文件:<input type="file" name="file2"/><br/>
<input name="name" value="张三"/><br/>
<input name="age" value="20"/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
servlet代码:
package com.servlet;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import java.util.*;
@WebServlet("/FileUpload1")
public class FileUpload1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建上传对象,设置文件缓冲区大小和文件缓冲区目录
DiskFileItemFactory factory = new DiskFileItemFactory(10 * 1024, new File("F:/各类缓存/upload"));
// 该类用于在servlet中实现文件上传
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置文件名的编码,文件上传限制
upload.setHeaderEncoding("utf-8");
upload.setFileSizeMax(300 * 1024);// 设置单个文件大小限制,单位字节,这里是300kb
upload.setSizeMax(400 * 1024);// 设置整体文件大小限制,单位字节,这里是400kb
upload.setProgressListener(new MyProgressListener());
// 解析request数据、每一个上传的文件对应一个被封装好的FileItem中
// 普通文本类型的参数也会被封装到list中
try {
List<FileItem> list = upload.parseRequest(request);
// 取出第一个上传的文件
for (FileItem file : list) {
//判断是文件还是属性
if (file.isFormField()) {
//判断参数名
if("name".equals(file.getFieldName())) {
String name = file.getString("utf-8");//获取到该参数,并设置字符集编码
System.out.println(name);
}
if("age".equals(file.getFieldName())) {
int age = Integer.parseInt(file.getString());
System.out.println(age);
}
} else {
// 得到文件大小
long fileSize = file.getSize();
// 得到并限制文件类型
String contentType = file.getContentType();
if (!contentType.toLowerCase().matches("text/plain")) {
throw new FileTypeErrorExeception("上传的文件类型不是文本类型,请重新选择");
}
// 得到文件数据内容
InputStream in = file.getInputStream();
// 得到文件名,并通过UUID算法生成随机名称
String fileName = file.getName();
fileName = UUID.randomUUID().toString() + fileName;
// 将文件数据内容储存到服务器端的硬盘中
FileUtils.copyInputStreamToFile(in, new File("F:/各类缓存/upload/" + fileName));
// 上传完毕手动清理缓存文件
file.delete();
System.out.println(fileName + fileSize + contentType + in);
}
}
} catch (FileTypeErrorExeception e) {
// 出现文件类型异常后,将错误信息转发到上传页面
request.setAttribute("msg", e.getMessage());
request.getRequestDispatcher("upload1.jsp").forward(request, response);
} catch (FileSizeLimitExceededException e) {
request.setAttribute("msg", "超过单个文件大小限制");
request.getRequestDispatcher("upload1.jsp").forward(request, response);
} catch (SizeLimitExceededException e) {
request.setAttribute("msg", "超过总文件大小限制");
request.getRequestDispatcher("upload1.jsp").forward(request, response);
} catch (FileUploadException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
class FileTypeErrorExeception extends Exception {
public FileTypeErrorExeception(String msg) {
super(msg);
}
}
class MyProgressListener implements ProgressListener {
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("已经上传了" + pBytesRead + "字节,总字节数为" + pContentLength + "字节,现在正在上传第" + pItems + "个文件!");
}
}