使用超链接和后台Servlet实现文件上传和下载(附图和代码)

使用工具:IntelliJ IDEA 2020.1.1、Tomcat 9.0.33

1.文件上传

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

1.1前台页面

在做文件上传时,会有一个上传文件的界面,首先需要一个表单,并且表单的请求方式为POST,其次form表单的enctype必须设为“multipart/form-data”,即enctype=“multipart/form-data”,意思是设置表单的类型为文件上传表单,默认情况下这个表单类型是"application/x-www-form-urlencoded",不能用于文件上传,只有使用了multipart/form-data才能完整地传递文件数据

2.文件下载

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

2.1超链接下载

当在HTML或jsp页面中使用a标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的资源时会自动下载;当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如txt、png、jpg等,当然也可以通过download属性规定浏览器进行下载,但有些浏览器并不支持。

默认下载:

<!--当超链接遇到浏览器不识别的资源时会自动下载 -->
<a href="fmm.zip">超链接下载</a>

指定download属性下载:

<!--当超链接遇到浏览器识别的资源时,默认不会下载,通过download属性可进行下载 -->
<a href="fmm.txt" download>超链接下载</a>

准备:
1.新建项目
在这里插入图片描述
2.Tomcat与idea集成,配置服务器
链接:IDEA编辑器集成Tomcat

3.项目目录:
注意html文件是建立在web目录下的,不是WEB-INF,imgs与WEB-INF同级,将所需的图片等资源复制到里边。
在这里插入图片描述
关于访问:
idea编辑器在Tomcat启动的时候,会将图片等一些资源放到他的一个Artifact输出路径当中,也就是说当服务器启动的时候,这些资源的路径并没有在项目路径下,如果想的话,需要单独设置,如果想要图片被访问到,编辑服务器,在Deployment中点+号,资源路径,选择目录,更改context,如/fmm/imgs,到时图片等会在此后追加,如,/fmm/imgs/fmm.png
在这里插入图片描述
在这里插入图片描述
upload.html内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <!--
        文件上传
            1.准备表单
            2.设置表单的提交类型 method="post"
            3.设置表单类型为文件上传表单 enctype="multipart/form-data"
            4.设置文件提交的地址 action="uploadServlet",要与后台一致
            5.准备表单元素
                1.普通的表单项 type="text",text文本框
                2.文件项 type="file"
            6.设置表单元素的name属性值(表单提交一定要设置name属性值),否则后台无法接受数据
    -->
    <form method="post" enctype="multipart/form-data" action="uploadServlet">
        姓名:<input type="text" name="uname"><br>
        文件:<input type="file" name="myfile"><br>
        <!--button默认的类型是提交类型,即type="submit" ,所以如果需要更改,要注意一下-->
        <button>提交</button>
    </form>

</body>
</html>

download.html内容
download属性可以不写任何信息,会自动使用默认文件名,如果设置了download属性的值,则使用设置的值作为文件名,当用户打开浏览器点击链接的时候就会直接下载文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <!--前两个是浏览器能识别的资源
        前两个点击之后直接显示,后一个直接下载,这是超链接本身的特性
        如果不想直接显示,需设置download属性,可以通过设置的属性值当做下载的文件名
        如果没有设置,则当前是什么文件名下载后还是什么文件名
    -->
    <a href="imgs/fmm.txt">文本文件</a>
    <a href="imgs/fmm.jpg">图片文件</a>
    <a href="imgs/fmm.zip">压缩文件</a>
    <hr>
    <!--设置可下载,download属性-->
    <a href="imgs/fmm.txt" download>文本文件</a>
    <a href="imgs/fmm.jpg" download="qzl.jpg">图片文件</a>

</body>
</html>

效果展示:
显示内容的,即 < hr >标签之前的
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
设置download属性之后的效果,即都可下载,不是直接在浏览器页面显示内容
在这里插入图片描述
在这里插入图片描述

2.2后台代码实现功能

建包和类
在这里插入图片描述

响应头:允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和堆Request-RUI所标识的资源进行下一步访问的信息。更多相关信息可以浏览器右键检查寻找!!

package com.fmm.servlet;/*
 *  Fmm
 */

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 {
        //设置请求的编码格式
        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;
        }
        //得到图片存放的路径,真实路径
        String path = request.getServletContext().getRealPath("/imgs/");
        //通过路径得到file对象
        File file = new File(path + fileName);
        //判断图片是否存在并且是一个标准文件
        if(file.exists()&&file.isFile()){
            //设置响应类型为浏览器无法使用某种方式或激活某个程序来处理的MIME类型
            response.setContentType("application/x-msdownload");
            //设置响应头,展示文件名和下载框
            response.setHeader("Content-Disposition","attachment;filename=" + fileName);
            //响应文件
            InputStream in = new FileInputStream(file);
            //得到字节流,因为是文件,要字节,用字符时没有办法输出的
            ServletOutputStream out = response.getOutputStream();
            byte[] bytes = new byte[1024];
            int len = 0;
            //输出
            while((len=in.read(bytes))!=-1){
                out.write(bytes,0,len);//可除去多余的空格,因为1024内容,后面缓冲区有余
            }
            //关闭资源,注意关闭顺序,先创建的后关闭
            out.close();
            in.close();
        }else{
            response.getWriter().write("文件不存在,请重试!");
            response.getWriter().close();
        }
    }
}

效果图
未输入任何文件名!!
在这里插入图片描述
正确输入文件名!!
在这里插入图片描述
下载好的内容都可以在本地的下载目录中找到
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/107867373