随笔 - 355  文章 - 0  评论 - 3  阅读 - 63106

文件的上传和下载

文件的上传和下载

学习链接:038-Servlet-文件上传-后台代码实现_哔哩哔哩_bilibili

一、文件上传

1.前台页面

  需要一个表单作为上传文件的界面,表单请求方式为 POST,在form 表单的enctype必须设置为"multipart/form-data",意思是设计表单的类型为文件上传表单。

  注意:默认情况下表单的类型是"application/x-www-form-urlencoded",不支持文件上传,只有使用 multiparty/form-data才能完整的传递文件数据。

复制代码
<!--
文件上传:
    1.准备表单
    2.设置表单提交类型POST
    3.设置表单类型为文件上传表单enctype="multipart/form-data"
    4.设置文件提交的地址 action
    5.准备表单元素
        1)普通表单项     type="text"
        2)文件表单项     type="file"
    6.表单提交一定要设置name属性值,否则后台无法收到数据
-->
    <form  method="post" enctype="multipart/form-data" action="uploadServlet">
        姓名:<input type="text" name="uname"><br>
        文件:<input type="file" name="myfile"><br>
        <button>提交</button>
    </form>
复制代码

2.后台实现

  使用注解@MultipartConfig将一个Servlet标识为支持文件上传。Servlet将  multipart/form-data  的POST请求封装成Part对象,通过Part对上传的文件进行操作。

  因为前台设置的enctype="multipart/form-data",如果不写@MultipartConfig注解,不仅仅是文件不能上传,连普通的值也是无法拿到的

复制代码
@WebServlet("/uploadServlet")
@MultipartConfig //文件上传必须要设置此注解
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件上传");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        //获取普通参数
        String uname = request.getParameter("uname");//name属性值
        System.out.println("uname: "+uname);
        //获取Part对象
        Part part = request.getPart("myfile");//name属性值
        //获取上传的文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上传文件名:"+fileName);
        //获取文件的存放路径
        String filePath = request.getServletContext().getRealPath("/");
        System.out.println("文件存放的路径:"+filePath);
        //上传文件到指定目录
        part.write(filePath+"/"+fileName);
    }
}

复制代码

 

 

 在对应的路径下,可以看到被上传的文件

 

 

 二、文件下载

1.超链接下载

标签<a></a>

复制代码
<!--
通常情况下,浏览器能够识别txt、png文件,可以进行查看,而像压缩文件这种浏览器不会识别,就会进行下载
通过设置download属性规定浏览器进行下载,如果download属性不写任何消息,会使用默认的文件名,否则就会使用设置的值作为文件名
-->
    <a href="download/text.txt">文本文件</a>
    <a href="download/picture.png">图片文件</a>
    <a href="download/test.rar">压缩文件</a>
<!--下载浏览器能够识别的资源-->
    <hr>
    <a href="download/text.txt" download>文本文件</a>
    <a href="download/picture.png" download="图片.png">图片文件</a>
<!--下载的文件名为  图片.png  -->
复制代码

2.通过代码下载(后台实现)

downloadServlet.java

复制代码
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件下载...");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //获取下载的文件名(参数)
        String fileName = request.getParameter("fileName");
        //***参数的非空判断  trim():去除字符串的前后空格
        if(fileName==null||"".equals(fileName.trim())){
            response.getWriter().write("请输入要下载的文件名");
            //关闭流
            response.getWriter().close();
            return;
        }
        //获取路径   注意这个资源要放在哪里的,如要放在 download 目录下的,则要写"/download/"
        String path = request.getServletContext().getRealPath("/download/");
        //通过路径得到一个file对象'
        File file = new File(path+fileName);
        //注意:要判断文件是否存在并且是一个标准文件(不标准文件:文件夹)
        if(file.exists()&& file.isFile()){
            //开始下载
            //1.设置响应类型(浏览器无法去激活的一个响应类型)
            response.setContentType("application/x-msdownload");
            //2.设置响应头
            response.setHeader("Content-Disposition","attachment;filename="+fileName);
            //3.得到 file 文件的输入流
            InputStream in = new FileInputStream(file);
            //4.得到输出流
            ServletOutputStream out = response.getOutputStream();
            //5.输出资源
            byte[] bytes = new byte[1024];
            int len=0;//定义长度
            //循环输出
            while((len = in.read(bytes))!=-1){
                out.write(bytes,0,len);//输出:长度从 0 开始到 len 结束
            }
            //关闭资源
            out.close();
            in.close();
        }else{
            response.getWriter().write("文件不存在,请重试");
            response.getWriter().close();
        }
    }
}
复制代码

download.html

复制代码
<body>
<!--
通常情况下,浏览器能够识别txt、png文件,可以进行查看,而像压缩文件这种浏览器不会识别,就会进行下载
通过设置download属性规定浏览器进行下载,如果download属性不屑任何消息,会使用默认的文件名,润泽就会使用设置的值作为文件名
-->
    <a href="download/text.txt">文本文件</a>
    <a href="download/picture.png">图片文件</a>
    <a href="download/test.rar">压缩文件</a>
<!--下载浏览器能够识别的资源-->
    <hr>
    <a href="download/text.txt" download>文本文件</a>
    <a href="download/picture.png" download="图片.png">图片文件</a>

    <hr>
    <form action="downloadServlet">
        文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
        <button>下载</button>
    </form>

</body>
复制代码

 

 

 

 

 

 

posted on   201812  阅读(213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示