前端页面的设置
1、表单的请求方式必须是post
2、表单提交的类型 enctype=”multipart/form-data”
3、上传控件 file类型 必须得写name属性:
需要用到第三方库
文件上传注意事项:
1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如web-inf目录。2、为防止文件覆盖的现象发生要为上传文件产生一个唯一的文件名3、限制上传文件的最大值可以用UUID,MD5等方式产生一个不重复的字符串
4、可以限制上传文件的类型,在收到上传文件名时,判断后缀是否合法
需要导入的包
commons-fileupload-xx.jar commons-io-xx.jar
maven添加依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
1、判断是否为上传文件的表单类型
2、创建DiskFileItemFactory 对象,处理文件上传文件路径,或者大小限制
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(upLoadFile);
//设置缓冲区
factory.setSizeThreshold(1024*1024);
3、获取ServletFileUpload,创建上传核心类
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
4、获取对象
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems){
InputStream inputStream = fileItem.getInputStream();
//创建一个文件输出流
FileOutputStream fos = new
//创建一个输出流
FileOutputStream(realPath+"/"+uuidpath+fileExName);
//输出
fos.write();
//关闭流
fos.close();
inputStream.close();
}
报错:
the request doesn’t contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded
排查后,发现是因为没有把req变为utf-8编码
解决了问题
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class uploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//
System.out.println("进入dopost");
//1、判断是否为上产文件的表单类型,如果不是,直接结束
if (!ServletFileUpload.isMultipartContent(req)) {
return ;
}
String upLoadPath =this.getServletContext().getRealPath("WEB-INF/upload");
File upLoadFile = new File(upLoadPath);
if(!upLoadFile.exists())
upLoadFile.mkdir();
//缓存,临时文件
//临时路径,如果文件超过预期,放入临时文件目录,一定时间后删除
// 1.配置DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(upLoadFile);
//设置缓冲区
factory.setSizeThreshold(1024*1024);
// 2.创建上传核心类
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
try {
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems) {
// 判断表单类型
if (fileItem.isFormField()) {
// 普通表单
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8");
//map.put(name, value);
System.out.println(name+" "+value);
} else {
// 处理文件
String uploadFileName = fileItem.getName();
//存在文件名不合法的情况
if(uploadFileName.trim().equals("")||uploadFileName==null){
continue;
}
//获得上传的文件名,
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
//获得文件后缀名
String fileExName= uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
String uuidpath= UUID.randomUUID().toString();
String realPath = upLoadPath+"/"+uuidpath;
//给每个文件创建一个对应的文件夹
File reaPathFIle = new File(realPath);
if(!reaPathFIle.exists()){
reaPathFIle.mkdir();
}
// 文件传输
//获得文件上传的流
InputStream inputStream = fileItem.getInputStream();
//创建一个文件输出流
FileOutputStream fos = new FileOutputStream(realPath+"/"+uuidpath+fileExName);
//realPath = 真的文件夹
//创建一个缓冲区
byte[] buffer = new byte[1024*1024];
int len = 0;
//判断是否读取完毕
while((len = inputStream.read(buffer))>0){
fos.write(buffer);
}
fos.close();
inputStream.close();
fileItem.delete();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter writer = resp.getWriter();
writer.write("成功");
System.out.println("结束");
}
}