文件上传:
1、上传文件相对较大不能使用get方式提交[get在url地址中携带数据,数据大小有显示,post没有限制]
2、form表单在提交数据时,默认会对表单中数据进行编码再提交给服务器[enctype="application/x-www-form-urlencoded"]
如果form表单上传文件,不能对表单中的文件进行编码,如果编码会造成文件丢失[enctype="multipart/form-data"]
servlet层
package com.atguigu.servlet;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
/**
*/
public class RegistServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
// 获取文件的真实路径
ServletContext context = getServletContext();
String realPath = context.getRealPath("/upload");// 在项目根目录下查找upload文件夹的真实路径
File file = new File(realPath);
if (!file.exists()) {
// 如果upload文件夹不存在则创建一个
file.mkdirs();
}
// fileUpload: 必须依赖commons-io
// 使用步骤:1、导包
// 2、创建一个工厂类
DiskFileItemFactory itemFactory = new DiskFileItemFactory();
// 3、根据工厂类对象创建解析器对象[将浏览器传过来的流解析成一个个的表单项,根据表单项对象的属性判断是普通文本还是文件]
ServletFileUpload fileUpload = new ServletFileUpload(itemFactory);
// 设置文件大小限制 限制单个文件大小为20k
fileUpload.setFileSizeMax(508 * 1024);
// 限制上传文件的总大小
fileUpload.setSizeMax(500 * 1024);
// 4、使用解析器对象解析请求报文
try {
// 解析时会判断文件的大小
List<FileItem> list = fileUpload.parseRequest(request);
// FileItem 代表一个表单项
for (FileItem fileItem : list) {
/*
* System.out.println("表单项name属性值:"+fileItem.getFieldName());
* System.out.println("文件名-:"+fileItem.getName());
* System.out.println("表单数据大小:"+fileItem.getSize());
* System.out.println("表单项value属性值:"+fileItem.getString("UTF-8")
* ); System.out.println("文件类型-:"+fileItem.getContentType());
* //如果true:代表是一个普通表单项,如果为false代表是一个文件表单项
* System.out.println("是否为表单项:"+fileItem.isFormField());
* System.out.println("---------------------------------------")
* ;
*/
if (fileItem.isFormField()) {
// 普通文本项
System.out.println("表单项value属性值:" + fileItem.getString("UTF-8"));
} else {
if (fileItem.getSize() > 10) {
// 文件表单项
// 将文件保存到本地[文件名不能随意,需要使用一个唯一的名字,如果文件名相同会被覆盖]
// 使用UUID拼接文件名
String uuid = UUID.randomUUID().toString().replace("-", "");
String fileName = fileItem.getName();
fileName = uuid + "_" + fileName;
// 参数1:文件夹的路径 参数2:要保存的文件名
File f = new File(file, fileName);
try {
fileItem.write(f);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
} catch (FileSizeLimitExceededException e) {
// 给出提示,单个文件大小不能超过20k
response.getWriter().write("单个文件不能超过20k");
} catch (SizeLimitExceededException e) {
// 给出提示,总文件大小不能超过60k
response.getWriter().write("总文件大小不能查过60k");
} catch (FileUploadException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
简单的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>
<!--
文件上传:
1、上传文件相对较大不能使用get方式提交[get在url地址中携带数据,数据大小有显示,post没有限制]
2、form表单在提交数据时,默认会对表单中数据进行编码再提交给服务器[enctype="application/x-www-form-urlencoded"]
如果form表单上传文件,不能对表单中的文件进行编码,如果编码会造成文件丢失[enctype="multipart/form-data"]
-->
<form enctype="multipart/form-data" action="${pageContext.request.contextPath }/RegistServlet" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
生活照1:<input type="file" name="photo1"/><br/>
生活照2:<input type="file" name="photo2"/><br/>
生活照3:<input type="file" name="photo3"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>