该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:
表 5. @MultipartConfig 的常用属性
属性名 | 类型 | 是否可选 | 描述 |
fileSizeThreshold | int | 是 | 当数据量大于该值时,内容将被写入文件。 |
location | String | 是 | 存放生成的文件地址。 |
maxFileSize | long | 是 | 允许上传的文件最大值。默认值为 -1,表示没有限制。 |
maxRequestSize | long | 是 | 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。 |
upload.html
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet() {}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 获取请求项, 封装成Part对象
Part part = request.getPart("f");
//String fileName = part.getSubmittedFileName();
//获取HTTP头信息headerInfo=(form-data; name="file" filename="文件名")
String headerInfo = part.getHeader("content-disposition");
//从HTTP头信息中获取文件名fileName=(文件名)
String fileName = headerInfo.substring(headerInfo.lastIndexOf("=") + 2, headerInfo.length() - 1);
System.out.println(fileName);
String direc = this.getServletContext().getRealPath("/upload/");
File dirf = new File(direc);
if(!dirf.exists()){
dirf.mkdirs();
}
part.write(direc+fileName);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
使用request.getParts() 多文件上传
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
Collection
for(Part part:parts){
String fileName = part.getSubmittedFileName();
System.out.println(fileName);
if(null!=fileName&&!(fileName).trim().equals("")){
String direc = this.getServletContext().getRealPath("/upload/");
File dirf = new File(direc);
if(!dirf.exists()){
dirf.mkdirs();
}
part.write(direc+fileName);
}
}
下载文件
import …………
@WebServlet("/DownLoad")
public class DownLoad extends HttpServlet{
private static final long serialVersionUID = 1L;
public DownLoad(){
super();
}
protected void doGet(HttpServletRequest request ,HttpServletResponse response)
throws ServletException,IOException{
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
try{
//服务器相对路径
String filepath = "WEB-INF/web.xml";
//服务器绝对路径
String fullFilePath = getServletContext().getRealPath(filepath);
System.out.println(fullFilePath);
/*打开文件,创建File类型的文件对象*/
File file = new File(fullFilePath);
/*如果文件存在*/
if(file.exists()){
System.out.println("文件存在");
/*获得文件名,并采用UTF-8编码方式进行编码,以解决中文问题*/
String filename = URLEncoder.encode(file.getName(), "UTF-8");
System.out.println(filename);
/*重置response对象*/
response.reset();
//设置文件的类型,xml文件采用text/xml类型,详见MIME类型的说明
response.setContentType("text/xml");
//设置HTTP头信息中内容
response.addHeader("Content-Disposition","attachment:filename=\"" + filename + "\"" );
//设置文件的长度
int fileLength = (int)file.length();
System.out.println(fileLength);
response.setContentLength(fileLength);
/*如果文件长度大于0*/
if(fileLength!=0){
//创建输入流
InputStream inStream = new FileInputStream(file);
byte[] buf = new byte[4096];
//创建输出流
ServletOutputStream servletOS = response.getOutputStream();
int readLength;
//读取文件内容并写到response的输出流当中
while(((readLength = inStream.read(buf))!=-1)){
servletOS.write(buf, 0, readLength);
}
//关闭输入流
inStream.close();
//刷新输出缓冲
servletOS.flush();
//关闭输出流
servletOS.close();
}
}else {
System.out.println("文件不存在~!");
PrintWriter out = response.getWriter();
out.println("文件 \"" + fullFilePath + "\" 不存在");
}
}catch(Exception e){
System.out.println(e);
}
}
}