文件上传、下载

本文详细介绍了如何使用JSP和Servlet实现文件上传,包括底层字节流操作和Apache Commons FileUpload库的应用,并展示了文件下载的基本步骤。重点在于实战演示和常见技术细节处理。

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

文件上传

jsp

jsp需要做如下配置:

  1. <input>标签的 type="file",需要带上name属性
  2. <form>表单的 method="post"
  3. <form>表单的enctype="multipart/form-data",表示以二进制流传输

servlet

方法一:底层方法读写

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        InputStream inputStream = req.getInputStream(); // 获取字节流
        Reader reader = new InputStreamReader(inputStream); //将inputStream 字节流 转化成 字符流
        BufferedReader bufferedReader = new BufferedReader(reader); // 建立一个缓冲字符流,

        String path = req.getServletContext().getRealPath("file/copy.txt"); //获取文件的绝对路径
        OutputStream outputStream = new FileOutputStream(path); // 输出字节流
        Writer writer = new OutputStreamWriter(outputStream);  // 输出字符流
        BufferedWriter bufferedWriter = new BufferedWriter(writer);// 输出字符缓冲流


        String str = "";
        while((str = bufferedReader.readLine())!=null)
        {
            bufferedWriter.write(str);
            bufferedWriter.flush();

        }
        bufferedWriter.close();
        writer.close();
        outputStream.close();
        bufferedReader.close();
        reader.close();
        inputStream.close();
    }

这种方法读取会包含一些浏览器的信息,以字节流读取可换行,字符流读取无法换行


方法二:利用apache提供的包:commons-fileuploadcommons-io 利用面向对象的思想去读写,包需要自己下载和配置到项目中。

fileupload包可将所有的请求信息解析为FileItem对象,通过对FileItem对象的操作完成读写功能。

   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        try {
            List<FileItem> list = servletFileUpload.parseRequest(req);
            for(FileItem item:list)
            {
//                System.out.println(item.getName());  //文件名
//                System.out.println(item.getFieldName()); // input组件里的属性名字
                if(item.isFormField()) //输入框
                {
                    String name = item.getFieldName();
                    String value = item.getString("UTF-8");
                    System.out.println(name+":"+value);
                }
                else //文件
                {
                    String name = item.getName();
                    long size = item.getSize();
                    System.out.println(name+":"+size+"Byte");
                    InputStream inputStream = item.getInputStream();
//                    Reader reader = new InputStreamReader(inputStream);
//                    BufferedReader bufferedReader = new BufferedReader(reader);

                    String path = req.getServletContext().getRealPath("file/"+name); //获取文件的绝对路径
                    OutputStream outputStream = new FileOutputStream(path); 
//                    Writer writer = new OutputStreamWriter(outputStream);
//                    BufferedWriter bufferedWriter = new BufferedWriter(writer);
                    int tmp = 0;
                    while ((tmp=inputStream.read())!= -1)
                    {
                        outputStream.write(tmp);
                    }

//                    String tmp = "";
//                    while ((tmp = bufferedReader.readLine())!=null)
//                    {
//                        bufferedWriter.write(tmp);
//                    }
//                    bufferedWriter.close();
//                    writer.close();
                    outputStream.close();
//                    bufferedReader.close();
//                    reader.close();
                    inputStream.close();
                    System.out.println("上传成功");
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
 }

以字节流读取、保存,可适用任何文件,字符流只是针对文本信息


文件下载

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 <a href="/download?type=jpg"> 1.jpg </a>
 <a href="/download?type=txt"> 1.txt </a>
</body>
</html>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/octet-stream"); //设置响应方式
        String type = req.getParameter("type");
        String fileName = "";
        if(type.equals("txt"))
        {
            fileName = "1.txt";
        }
        if(type.equals("jpg"))
        {
            fileName = "1.jpg";
        }
        resp.setHeader("Content-Disposition","attachment;filename="+fileName);//设置下载后的文件名
        OutputStream outputStream = resp.getOutputStream();//获取输出流
        String path  = req.getServletContext().getRealPath("file/"+fileName);//获取资源路径

        InputStream inputStream = new FileInputStream(path);
        int tmp =0;
        while ((tmp=inputStream.read())!=-1)
        {
            outputStream.write(tmp);
        }

        inputStream.close();
        outputStream.close();


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值