一、文件上传

准备前台页面-准备后台代码

(一)准备前台页面

1. 准备表单

(1)设置表单提交类型POST

(2)设置表单编码类型multipart/form-data

(3)设置表单提交地址

2. 准备表单元素

(1)普通表单项,<input type="text" name="..."></input>

(2)文件表单项,<input type="file" name="..."></input>

(3)button提交,button的默认类型为submit

<form method="post" enctype="multipart/form-data" action="upload01">
    请输入用户名:<input type="text" name="username"> <br>
    请上传文件:<input type="file" name="myfile">  <br>
    <button>提交</button>
</form>

(二)准备后台代码

1. 类定义行上@MultipartConfig

(1)标识该Servlet支持文件上传

(2)Servlet将multipart/form-data的post请求封装为Part对象,通过Part对象对上传的文件进行操作

(3)上传文件对应的part对象:获取文件名字、上传文件到后台的指定目录

2. 设置请求响应编码

(1)req.setCharacterEncoding("utf-8")                     //设置请求编码

(2)resp.setContentType("text/html;charset=utf-8") //设置响应编码

3. 通过普通表单项的name属性值,获取前台传递的参数

4. 通过获取文件表单项的name属性值,获取前台传递的文件

(1)获取part对象

req.getPart("文件表单项的name属性值")

(2)获取文件的名字:

part对象.getSubmittedFileName()

(3)获取文件的存放路径(放在项目资源路径下面)

req.getServletContext().getRealPath("/")

(4)上传文件到后台的指定目录:

part对象.write(realPath + submittedFileName)

@WebServlet("/upload01")
@MultipartConfig
public class Upload01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 1. 设置请求响应编码 */
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        /* 2. 通过普通表单项的name属性值,获取前台传递的参数 */
        String username = req.getParameter("username");
        System.out.println(username);

        /* 3. 通过获取文件表单项的name属性值,获取前台传递的文件*/
        //(1)获取part对象
        Part myfile = req.getPart("myfile");
        //(2)获取文件的名字
        String submittedFileName = myfile.getSubmittedFileName();
        System.out.println(submittedFileName);
        //(3)获取文件的存放路径(放在项目资源路径下面)
        String realPath = req.getServletContext().getRealPath("/");
        //(4)上传文件到后台的指定目录
        myfile.write(realPath + submittedFileName);
    }
}

二、文件下载

(一)超链接下载

1. 遇见可识别的资源(如png),会进行跳转;可用download属性规定下载(不同浏览器不一定支持)

2. 遇见不识别的资源(如rar),会进行下载

3. 设置资源路径,浏览器才可访问到资源

(1)在web目录下新建download目录,用于存放服务器可下载资源

(2)设置资源路径

点击服务器的编辑配置,部署,点击“+”号,外部源,选择服务器可下载资源的存放目录,确定

点击应用程序上下文,将默认路径改为:/指定站点名/资源存放目录名,应用确定

(3)代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>download02</title>
</head>
<body>

    <a href="download/01picture.png" >png跳转</a> <br>
    <a href="download/02text.txt" >txt跳转</a>  <br>
    <a href="download/03.rar" >rar跳转</a>  <br>

    <a href="download/01picture.png" download>png下载</a> <br>
    <a href="download/02text.txt" download>txt下载</a>  <br>
    <a href="download/03.rar" download>rar下载</a>  <br>

</body>
</html>

(二)后台实现下载

准备前台页面-准备后台代码

1. 准备前台页面

<form method="post"  action="download03">
    <input type="text" name="filename" placeholder="请输入要下载的文件名">
    <button>提交</button>
</form>

2. 准备后台代码

(1)设置请求响应编码
(2)获取文件名
(3)获取文件存放路径(项目资源真实路径)
(4)获取file对象
(5)文件下载三步走
①设置响应类型
②设置响应头
③读取下载文件
@WebServlet("/download03")
public class Download03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 1. 设置请求响应编码 */
        req.setCharacterEncoding("utf-8");
        resp.setContentType("txt/html;charset=utf-8");

        /* 2. 获取文件名 */
        String filename = req.getParameter("filename");
        // 判断文件名是否非空,trim()去除字符串前后空格
        if (filename == null || "".equals(filename.trim())) {
            resp.getWriter().write("请输入文件名");
            resp.getWriter().close();
            return;
        }
        else {
            /* 3. 获取文件存放路径(项目资源真实路径)*/
            String realPath = req.getServletContext().getRealPath("/");

            /* 4. 获取file对象 */
            File file = new File(realPath + filename);
            // 判断文件是否为标准文件(存在且不是目录)
            if (file.exists() && file.isFile()) {
                /* 5. 文件下载三步走 */
                //1. 设置响应类型
                resp.setContentType("application/x-msdownload");
                //2. 设置响应头
                resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
                //3. 读取下载文件
                //得到file文件输入流
                FileInputStream fileInputStream = new FileInputStream(file);
                //得到字节输出流
                ServletOutputStream outputStream = resp.getOutputStream();
                //定义byte数组
                byte[] bytes = new byte[1024];
                //定义长度
                int length=0;
                //循环输出
                while ((length = fileInputStream.read(bytes)) != -1 ){
                    outputStream.write(bytes, 0, length);
                }
                //释放资源
                fileInputStream.close();
                outputStream.close();
            }
        }

    }
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐