在Servlet3.0之前,处理上传文件的操作一直是让开发者头疼的问题,因为Servlet本身没有对此提供直接的支持,需要使用第三方框架来实现,而且使用起来也不够简单。
Servlet3.0提供了对文件上传的支持,通过@MultipartConfig标注和HttpServletRequest的两个新方法getPart()和getParts(),开发者能够很容易实现文件的上传操作。
Servlet3.0提供了对文件上传的支持,通过@MultipartConfig标注和HttpServletRequest的两个新方法getPart()和getParts(),开发者能够很容易实现文件的上传操作。
@MultipartConfig标注主要是为了辅助Servlet3.0中HttpServletRequest提供的对上传文件的支持。该标注写在Servlet类的声明之前,一表示该Servlet希望处理的请求时multipart/form-data类型的。另外,该标注还提供了若干属性用于简化对上传文件的处理。
@MultipartConfig标注属性
fileSizeThershold int型 是(可选) 描述:当前数据量大于该值时,内容将被写入文件。
location String型 是(可选) 描述:存放生成文件的地址
maxFileSize long型 是(可选) 描述:允许上传的文件最大值,默认为-1,表示没有限制
maxRequestSize long型 是(可选) 描述:针对 multipart/form-data 请求的最大数量,默认为-1,表示没有限制
- <!--index.html文件部分代码-->
- <form action="/HelloWorld/UpLoad" method="post" enctype="multipart/form-data">
- <input type="file" name="file">
- <input type="submit" name="upload" value="上传">
- </form>
- /*UpLoad.java为上传文件的Servlet类*/
- package javaee.servlet;
- import …………
- //设置访问活着调用这个Servlet的路径
- @WebServlet("/UpLoad")
- //说明该Servlet处理的是multipart/form-data类型的请求
- @MultipartConfig
- public class UpLoad extends HttpServlet{
- private static final long serialVersionUID = 1L;
- public UpLoad(){
- 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{
- //说明输入的请求信息采用UTF-8编码方式
- request.setCharacterEncoding("utf-8");
- response.setContentType("text/html; charset=UTF-8");
- PrintWriter out = response.getWriter();
- //Servlet3.0中新引入的方法,用来处理multipart/form-data类型编码的表单
- Part part = request.getPart("file");
- //获取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);
- //获得存储上传文件的文件夹路径
- String fileSavingFolder = this.getServletContext().getRealPath("/UpLoad");
- //获得存储上传文件的完整路径(文件夹路径+文件名)
- //文件夹位置固定,文件夹采用与上传文件的原始名字相同
- String fileSavingPath = fileSavingFolder + File.separator + fileName;
- //如果存储上传文件的文件夹不存在,则创建文件夹
- File f = new File(fileSavingFolder + File.separator);
- if(!f.exists()){
- f.mkdirs();
- }
- //将上传的文件内容写入服务器文件中
- part.write(fileSavingPath);
- //输出上传成功信息
- out.println("文件上传成功~!");
- }
- }
- /DownLoadjava为下载文件的Servlet类*/
- package javaee.servlet;
- 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);
- }
- }
- }