jsp+servlet 实现文件的上传和下载

借助Apache提供的一套 commons-fileupload 组件,性能优异 API简单
在这里插入图片描述
上传同一文件会出现命名重复的问题,可以使用上传时间的毫秒数避免重复

System.currentTimeMillis()

UUID随机数同样可以避免名称重复

UUID.randomUUID()

一些常用方法

System.out.println("c.getString() = " + c.getString()); //表单内容
System.out.println("c.getName() = " + c.getName()); //文件名称
System.out.println("c.getFieldName() = " + c.getFieldName()); //表单域名称
System.out.println("c.getContentType() = " + c.getContentType());//文件类型
System.out.println("c.getSize() = " + c.getSize());//文件大小

jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>主页</title>
  </head>
  <body>
  文件上传
  1.提交方式必须是post
  2.enctype:multipart/form-data
  <form action="<%=request.getContextPath()%>/file?method=upload" method="post" enctype="multipart/form-data">
      姓名:<input type="text" name="name" value="joker"><br>
      图片:<input type="file" name="pic"><br>
      <input type="submit" value="提交">
  </form>
  </body>
</html>

servlet:

public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String method = request.getParameter("method");
        if ("upload".equals(method)){
            upload(request,response);
        } else if ("download".equals(method)){
            download(request,response);
        }
    }

    //文件下载
    private void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        File file = new File("f:\\test");
        response.setHeader("content-disposition","attachment;fileName=tom.jpg");  //打开文件保存窗口
        FileInputStream fileInputStream = new FileInputStream("F:\\test\\tom.jpg");
        ServletOutputStream outputStream = response.getOutputStream();
        byte[] bytes = new byte[1024];
        int len = -1;
        while ((len=fileInputStream.read(bytes))!=-1){
            outputStream.write(bytes,0,len);
        }
        fileInputStream.close();
        outputStream.close();

    }

    //文件上传
    private void upload(HttpServletRequest request, HttpServletResponse response) {
        //借助Apache提供的一套 Commons-fileUpload 组件,性能优异 API简单

        //工厂类 获取diskFileItemFactory ---> fileItemFactory
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

        servletFileUpload.setSizeMax(1024*1024*30);    //总体文件大小限制
        servletFileUpload.setFileSizeMax(1024*1024*3); //单个文件大小限制
        servletFileUpload.setHeaderEncoding("UTF-8");  //中文乱码
//        servletFileUpload.setProgressListener();     //设置上传进度

        if (ServletFileUpload.isMultipartContent(request)) { //判断客户端提交的enctype 必须是multipart/form-data
            //处理文件上传
            try {
                //解析当前文件上传的request
                List<FileItem> list = servletFileUpload.parseRequest(request);
                list.forEach(c->{
                    if (c.isFormField()){ //判断文件类型
                        //是普通表单字段
                        System.out.println("c.getName() = " + c.getName());
                        System.out.println("c.getString() = " + c.getString()); //表单内容
                        System.out.println("c.getFieldName() = " + c.getFieldName());
                        System.out.println("c.getContentType() = " + c.getContentType());
                        System.out.println("c.getSize() = " + c.getSize());
                        System.out.println("===================================");
                    }else {
                        System.out.println("c.getName() = " + c.getName());  //文件名称
                        System.out.println("c.getFieldName() = " + c.getFieldName()); //表单域名称
                        System.out.println("c.getContentType() = " + c.getContentType());//文件类型
                        System.out.println("c.getSize() = " + c.getSize());//文件大小
                        System.out.println("==================================");
                        File file = new File("F:\\test");  //保存到磁盘上
                        try {
                            //上传文件名称重复问题
//                            System.out.println(System.currentTimeMillis()); //根据上传时间毫秒数
//                            System.out.println(UUID.randomUUID());          //根据UUID随机数
                            String name = System.currentTimeMillis()+"."+c.getName().split("\\.")[1];
                            c.write(new File(file,name));
                            c.delete();  //删除缓存
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("未设置enctype");
        }
    }
}


运行结果:
在这里插入图片描述
在这里插入图片描述
如果想要存放到服务器的相对路径可以使用

request.getServletContext().getRealPath("/upload");

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值