1.使用 Servlet 3.1 内置的文件上传功能
表单内的type类型为file,请求方式为POST,enctype为multipart/form-data
<form method="post" enctype="multipart/form-data" action="uploadFile">
<input type="file" name="myFile"/><br/>
<input type="submit" value="上传">
</form>
相关的处理Servlet
package com.dendi.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
/**
* @author Dendi
* 处理上传的servlet
*/
@WebServlet("/uploadFile")
@MultipartConfig(maxFileSize = 5*1024*1024)
public class UploadServlet extends HttpServlet {
private final String UPLOAD_FILE = "D:\\IdeaProjects\\hearthstonedata\\web\\WEB-INF\\uploadFile";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取part集合
Collection<Part> parts = req.getParts();
for (Part part : parts) {
//获取相应的请求头信息
String header = part.getHeader("content-disposition");
//通过工具类获取文件名
String fileName = getFileName(header);
//实际需要上传的地址
String filePathName = UPLOAD_FILE+File.separator +fileName;
//String filePathName = "D:\\IdeaProjects\\hearthstonedata\\web\\WEB-INF\\uploadFile\\"+fileName;
part.write(filePathName);
}
}
/**
* 获取文件名
* @param header
* @return
*/
private String getFileName(String header){
String[] split = header.split("; ");
String item = null;
for (String s : split) {
if(s.startsWith("filename=")){
item = s;
break;
}
}
int start = item.indexOf('"')+1;
int end = item.lastIndexOf('"');
String fileName = item.substring(start,end);
System.out.println(fileName);
return fileName;
}
}
2.使用commons-fileupload 文件上传
相关依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
commons-fileupload上传将资源定义为FileItem,可以理解为第一种方式的part
Servlet
package com.dendi.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
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 java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author Dendi
* 使用commons-fileupload实现文件上传
*/
@WebServlet("/fileUpload")
public class CommonsServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建DiskFileItemFactory对象,该对象为解析器提供了缺省的配置
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建解析器
ServletFileUpload sfu = new ServletFileUpload(factory);
try{
//List<FileItem> 可以理解为part的集合
List<FileItem> items = sfu.parseRequest(req);
for (FileItem item : items) {
//判断普通文本域和文件上传域
if(item.isFormField()){
//普通文本域
String name = item.getString();
System.out.println("username="+name);
}else{
//文件上传域 获取上下文对象
ServletContext context = getServletContext();
// 获取文件上传目标目录的路径 会在upload的前面加上部署项目的项目根路径
String upload = context.getRealPath("upload");
File file = new File(upload);
if(!file.exists()){
file.mkdir();
}
//获取文件名
String name = item.getName();
File file1 = new File(upload+File.separator+name);
System.out.println("上传到服务器后的文件路径:" + file1);
item.write(file1);
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
这里需要注意的,使用commons-fileupload进行文件上传,在pom添加依赖后,如果启动报错,错误信息为java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils 等等
需要在idea的Project Structure 进行相关设置,将依赖添加到web项目中
以上