JavaWeb(3)文件上传和下载


在上网的时候,我们常常遇到文件上传的情况,例如头像上传,上传资料等;还有文件下载

一、文件上传

文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保存文件,这才是一个完整的文件上传。
👇👇👇

1.1 前台页面

在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的请求方式为POST其次我们的form表单的enctype必须设为“multipart/form-data",意思为设置表单的类型为文件上传表单。
upload.html

  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
  <form method="post" enctype="multipart/form-data" action="uploadServlet">
      姓名:<input type="text" name="uname"><br>
      文件:<input type="file" name="myfile"><br>
      <button>提交</button>
  </form>
</body>
</html>

1.2 后台实现

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

@WebServlet("/uploadServlet")
@MultipartConfig//如果是文件上传,必须加注解
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上传...");
        request.setCharacterEncoding("UTF-8");

        //获取表单参数
        String uname = request.getParameter("uname");
        System.out.println("uname:" + uname);

        //获取Part对象 将POST请求封装成Part对象
        Part part = request.getPart("myfile");//表单中file文件域的name属性
        //通过Part对象获得上传的文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上传文件名:" + fileName);
        //得到文件上传路径
        String filePath = request.getServletContext().getRealPath("/");
        System.out.println("文件存放路径:" + filePath);
        //上传文件到指定目录
        part.write(filePath + "/" + fileName);

    }
}

二、文件下载

即从服务器上的资源下载到本地,可以通过两种方式下载。第一种是通过超链接本身的特性来下载;第二种是通过代码下载。

2.1 超链接下载

当我们在HTML或JSP页面中使用a标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的资源时会自动下载;当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如txt,png.jpg等。当然我们可以通过download属性规定浏览器进行下载。
在这里插入图片描述
download属性可以不写任何信息,会自动使用默认文件名。如果设置了download属性的值,则使用设置的值作为文件名,当用户点击连接的时候就会直接下载该文件。
建立download.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <a href="download/技术%20.txt">文本文件</a>
    <a href="download/cute.jpg">图片文件</a>
    <a href="download/P.zip">压缩文件</a>
</body>
</html>

注意设置download文件夹的路径

2.2 后台实现下载

实现:
1.需要通过response.setContentType方法设置Content-type头字段的值,为浏览器无法使用某种方式或激活某个程序来处理的MIME类型
2.通过response.setHeader方法设置文件名
3.读取下载文件,调用response.getOutputStream方法向客户端写入附件内容。
前端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <a href="download/前端%20.txt">文本文件</a>
    <a href="download/cute.jpg">图片文件</a>
    <a href="download/P.zip">压缩文件</a>

    <hr>
    <a href="download/前端%20.txt">文本文件</a>
    <a href="download/cute.jpg">图片文件</a>
    <hr>
    <form action="downloadServlet">
        文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
        <button>下载</button>
    </form>
</body>
</html>
@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();
        }
        //得到图片存放的路径
        String path = request.getServletContext().getRealPath("/download/");
        //通过路径得到file对象
        File file = new File(path + fileName);
        //判断文件对象是否存在并且是一个标准文件
        if(file.exists() && file.isFile()){
            //设置相应类型
            response.setContentType("application/x-msdownload");
            //设置响应头
            response.setHeader("Content-Disposition","attachment;filename=" + fileName);
            //响应文件 得到输入流
            InputStream in = new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream out = response.getOutputStream();
            //定义byte数组
            byte[] bytes = new byte[1024];
            //定义长度
            int len = 0;
            //循环输出
            while((len = in.read(bytes)) != -1){
                //输出
                out.write(bytes,0,len);
            }
            //关闭资源
            out.close();
            in.close();

        }else{
            response.getWriter().write("文件不存在,请重试");
            response.getWriter().close();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

释怀°Believe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值