学习日志day41(2021-09-03)(1、文件的上传 2、文件的查看 3、文件的下载 4、使用工具类上传文件 5、基于servlet3.0以上的文件上传 )

这篇学习日志详细记录了JavaWeb中关于文件上传、查看和下载的操作,包括使用工具类进行文件上传,以及基于Servlet 3.0以上版本的文件上传方法。内容涵盖创建上传表单、实现FileUploadServlet、ShowFileServlet和DownLoadServlet,以及上传工具类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习内容:学习JavaWeb(Day41)

1、文件的上传
2、文件的查看
3、文件的下载
4、使用工具类上传文件
5、基于servlet3.0以上的文件上传


1、文件的上传

(1)实现文件的上传需要的依赖包
commons-fileupload.jar
commons-io.jar

(2)在jsp文件创建上传文件表单

<!--创建可以上传文件的表单需要声明enctype="multipart/form-data-->
<form class="form-horizontal" action="/fileUpload" method = "post" enctype="multipart/form-data">
    <div class="form-group">
        <label class="col-sm-2 control-label">文件描述:</label>
        <div class="col-sm-10">
            <input type="text" name="desc" />
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-2 control-label">点击上传文件:</label>
        <div class="col-sm-10">
            <input type="file" name="myFile" />
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <input type="submit" value="提交">
        </div>
    </div>
</form>

(3)创建FileUploadServlet.java

@WebServlet("/fileUpload")
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("WEB-INF/views/file.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //判定当前提交表单是不是一个文件表单 是true  否false
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            try {
                //构建factory对象用于ServletFileUpload构造方法中
                DiskFileItemFactory factory = new DiskFileItemFactory();
                //设置上传文件时用的临时空间
                ServletContext servletContext = this.getServletConfig().getServletContext();
                File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");//文件的临时目录
                factory.setSizeThreshold(1024); //设置临时空间大小
                factory.setRepository(repository);
                
                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setSizeMax(1024*1024*20);//设置表单提交所有内容总长度
                upload.setHeaderEncoding("UTF-8");//解决上传文件名的中文乱码

                //获取表单中所有的输入项                
                List<FileItem> fileItems = upload.parseRequest(request);
                for (FileItem item : fileItems) {
                    String contentType = item.getContentType(); //获取上传的文件类型
                    String fieldName = item.getFieldName();//获取控件name属性值
                    String name = item.getName();//上传的文件的文件名称
                    long size = item.getSize();//获取文件或文本大小
			//如果表单中不包含文件
                    if(item.isFormField()){
                        String value = item.getString("UTF-8");
                        //tomcat容器默认采用了iso-8859-1的编码方法
                        //可以反解码成二进制在解码
                        //value = new String(value.getBytes("ISO8859-1"),"UTF-8");
                        System.out.println(value);
                        System.out.println("contentType:" + contentType + "filedName : "+ fieldName + "name: "+ name + "size:" + size);
                        
                    }else{//表单中包含文件
                        System.out.println("contentType:" + contentType + "filedName : "+ fieldName + "name: "+ name + "size:" + size);
                        //获取上传文件的后缀名
                        int index = name.lastIndexOf(".");
                        String suffixName = name.substring(index);
                        //生成唯一文件名称

                        String randomName = UUID.randomUUID().toString();
                        String newName = randomName + suffixName;

                        //构建目录
                        File dir = new File("d:/img");
                        if(!dir.exists()){
                            dir.mkdir(); //创建单层目录 mkdirs() 创建多层目录
                        }
                        //构建文件
                        File file = new File(dir,newName);

                        InputStream is = item.getInputStream();
                        OutputStream os = new FileOutputStream(file);

                        BufferedInputStream bis = new BufferedInputStream(is);

                        byte[] buffer = new byte[1024*1024];
                        BufferedOutputStream bos = new BufferedOutputStream(os);
                        int len = -1;
                        while((len = bis.read(buffer)) != -1){
                            bos.write(buffer,0,len);
                        }

                        bos.flush();
                        bos.close();
                        bis.close();
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        } else {
            response.sendError(404, "文件表单设置有误!");
        }
    }
}

2、文件的查看

(1)创建查看文件的jsp页面

<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" href="/css/bootstrap.min.css">
</head>
<body>
<img src="/img/show" class="img-circle" alt="" width="100" height="100">
</body>
</html>

(2)创建ShowFileServlet.java文件

@WebServlet("/img/show")
public class ShowFileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String dir = DirectoryUtil.FILE_DIR;
        //查看exe文件时进行下载,
        //查看word和excel文档时会下载一个zip包,想要查看需要下载插件
        File file = new File(dir + "研发1固定资产横向表7.16.xlsx");
        InputStream is = new FileInputStream(file);
	//输出流为response.getOutputStream()
        OutputStream outputStream = response.getOutputStream();

        int len = -1;
        while((len = is.read()) != -1){
            outputStream.write(len);
        }
        is.close();
        outputStream.close();
    }
}

3、文件的下载

(1)创建DownLoadServlet.java文件

@WebServlet("/fileDownload")
public class DownLoadServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("multipart/form-data");
        File file = new File("d:/soft/typora-setup-x64.exe");
        //设置文件的长度,下载时会有进度条
        response.setContentLength(Long.valueOf(file.length()).intValue());
        String fileName = new String(file.getName().getBytes("UTF-8"),"ISO8859-1");
        //设置Content-Disposition,表示文件是被下载使用的。filename是下载的文件名
        response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\"");
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        int len = -1;
        while((len = bis.read()) != -1){
            bos.write(len);
        }
        bos.flush();
        bos.close();
        bis.close();
    }
}

4、使用工具类上传文件

(1)创建上传工具类

public class UploadUtil {
    public boolean upload(HttpServletRequest request) throws IOException, FileUploadException {
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            try {
                //构建factory对象用于ServletFileUpload构造方法中
                DiskFileItemFactory factory = new DiskFileItemFactory();

                //设置上传文件时用的临时空间
                File repository = new File("d:/temp");
                factory.setSizeThreshold(1024); //设置临时空间大小
                factory.setRepository(repository);

                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setSizeMax(1024*1024*10);//设置表单提交所有内容总长度

                //获取表单中所有的控件
                List<FileItem> fileItems = upload.parseRequest(request);
                for (FileItem item : fileItems) {

                    String contentType = item.getContentType(); //获取上传的文件类型
                    String fieldName = item.getFieldName();//获取控件name属性值
                    String name = item.getName();//上传的文件的文件名称
                    long size = item.getSize();//获取文件或文本大小

                    if (item.isFormField()) {
                        String value = item.getString();
                        value = new String(value.getBytes("ISO8859-1"), "UTF-8");
                        System.out.println(value);

                        System.out.println("contentType:" + contentType + "filedName : " + fieldName + "name: " + name + "size:" + size);
                    } else {

                        System.out.println("contentType:" + contentType + "filedName : " + fieldName + "name: " + name + "size:" + size);
                        //获取上传文件的后缀名
                        int index = name.lastIndexOf(".");
                        String suffixName = name.substring(index);
                        //生成唯一文件名称

                        String randomName = UUID.randomUUID().toString();
                        String newName = randomName + suffixName;

                        //构建目录
                        File dir = new File("d:/img");
                        if (!dir.exists()) {
                            dir.mkdir(); //创建单层目录 mkdirs() 创建多层目录
                        }
                        //构建文件
                        File file = new File(dir, newName);
                        InputStream is = item.getInputStream();
                        OutputStream os = new FileOutputStream(file);

                        BufferedInputStream bis = new BufferedInputStream(is);

                        byte[] buffer = new byte[1024 * 1024];
                        BufferedOutputStream bos = new BufferedOutputStream(os);
                        int len = -1;
                        while ((len = bis.read(buffer)) != -1) {
                            bos.write(buffer, 0, len);
                        }

                        bos.flush();
                        bos.close();
                        bis.close();

                    }
                }
            } catch (Exception e) {
                throw new FileUploadException("文件上传异常", e);
            }
            return true;
        } else {
            return false;
        }
    }
}

(2)调用工具类

@WebServlet("/fileUpload")
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("WEB-INF/views/file.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        UploadUtil uploadUtil = new UploadUtil();
        try {
            boolean result = uploadUtil.upload(request);
            if(!result){
                response.sendError(404,"表单设置有误!");
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
            response.sendError(500,"文件上传异常");
            return;
        }
}

5、基于servlet3.0以上的文件上传

(1)增加注解@MultipartConfig

@WebServlet("/upload3")
@MultipartConfig(maxRequestSize = 10000,maxFileSize = 2000)//最大请求值,最大文件大小
public class FileUploadServlet3 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String desc = request.getParameter("desc");
        System.out.println(desc);
         //上传文件只有一个时 Part file = request.getPart("myFile");
        Collection<Part> parts = request.getParts();//上传多个文件
        int count = 1;
        for (Part part : parts) {
            if (part.getName().equals("myFile")) {
                InputStream is = part.getInputStream();

                OutputStream os = new FileOutputStream(new File("d:/img/" + count + ".jpg"));

                int len = -1;
                while ((len = is.read()) != -1) {
                    os.write(len);
                }
                os.flush();
                is.close();
                os.close();
                count++;
            }
        }
       
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值