java web开发之 Servlet3之 @MultipartConfig注解(10)

@MultipartConfig

该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:

表 5. @MultipartConfig 的常用属性

 

属性名类型是否可选描述
fileSizeThresholdint当数据量大于该值时,内容将被写入文件。
locationString存放生成的文件地址。
maxFileSizelong允许上传的文件最大值。默认值为 -1,表示没有限制。
maxRequestSizelong针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。

upload.html

<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="f">
<br/>
<input type="submit" name="submit">
</form>
1
2
3
4
5
UploadServlet//request.getpart()单文件上传

@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<Part> parts = request.getParts();

        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);
        }
    }
}

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值