这是文件的上传功能,需要引入包upload和io包,同时,form需要设置enctype="mutilpart/form-data"
package com.qdcares.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
@WebServlet(name = "UploadServlet", value = "/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
/* 具体步骤:
* 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
* 2)利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
* 3)对 DiskFileItemFactory 对象设置一些 属性
* 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory);
目的是调用 parseRequest(request)方法 获得 FileItem 集合list ,
* 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理
* 6) * 第一种. 用第三方 提供的 item.write( new File(path,filename) ); 直接写到磁盘上
* 第二种. 手动处理*/
String username = request.getParameter("username");
System.out.println(username);
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 获得磁盘文件条目工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 获得真实路径,工临时文件存储和最终文件存储
String path=this.getServletContext().getRealPath("/WEB-INF/upload");
File file=new File(path);
if(!file.exists()&&!file.isDirectory()){
System.out.println(path+"目录不存在,需要创建!");
file.mkdir();
}
diskFileItemFactory.setSizeThreshold(1024*1024);
// 创建一个文件上传解码器
ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);
servletFileUpload.setHeaderEncoding("UTF-8");
List<FileItem> fileItemList= servletFileUpload.parseRequest(request);
for (FileItem fileItem:fileItemList) {
if(fileItem.isFormField()){
String value=fileItem.getString();
System.out.println(value);
}else{
/*
* 分三步走:
* 1、获得文件的路径名
* 2、
* */
String fileName=fileItem.getName();
String subFileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
System.out.println(subFileName);
// 这是采用的封装的方法
// fileItem.write(new File(path,subFileName));
// 采用传统的方法进行上传下载
OutputStream outputStream=new FileOutputStream(new File(path,subFileName));
InputStream inputStream=fileItem.getInputStream();
int length=0;
byte[] bytes=new byte[1024];
while((length=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,length);
}
inputStream.close();
outputStream.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}
}