javaWeb-5-文件上传与文件下载

目录

1、文件上传

1.1 文件上传的步骤

1.2 文件上传的代码演示-项目结构

1.2.1 编写一个前端页面用于上传操作:upload.html

1.2.2 编写一个后端动态资源处理器:UploadServlet

1.2.3 配置web.xml文件中的动态资源访问路径

1.2.4 文件上传测试

1.2.2-1 文件上传时客户端发送的HTTP协议内容格式

1.2.2-2 文件上传时需要使用的jar包说明: commons-fileupload常用API

2、文件下载

2.1 文件下载整体项目结构

2.2 编写一个用于下载的动态Servlet处理器

2.3 在web.xml文件中配置Servlet的访问路径

2.4 在Tomcat服务器中预先放置好静态资源

2.5 前端浏览器访问下载链接看下载效果

2.6 不同浏览器对中文编码的解决问题

1、文件上传

1.1 文件上传的步骤

1.2 文件上传的代码演示-项目结构

1.2.1 编写一个前端页面用于上传操作:upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_servlet/uploadServlet" method="POST" enctype="multipart/form-data">
    用户名:<input type="text" name="username"><br/>
    头像:<input type="file" name="photo"><br/>
    <input type="submit" name="上传">
</form>
</body>
</html>

1.2.2 编写一个后端动态资源处理器:UploadServlet

package com.wind.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 测试文件上传
 */
public class UploadServlet extends HttpServlet {

    private static final long serialVersionUID = -9188824273706312794L;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost文件上传过来了...");
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        //1.先判断上传的数据是否是多段数据(只有是多段的数据,才是文件上传的)
        if (ServletFileUpload.isMultipartContent(request)) {
            //2.创建FileItemFactory接口的工厂实现类
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            //3.创建用于解析上传文件数据的工具类ServletFileUpload
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            //4.解析上传文件数据,得到一个表单项数组
            try {
                List<FileItem> fileItems = servletFileUpload.parseRequest(request);
                //5.循环判断每一个表单项是普通数据还是上传的文件
                for (FileItem fileItem : fileItems) {
                    if (fileItem == null) {
                        continue;
                    }
                    if (fileItem.isFormField()) {
                        //如果是普通的表单项
                        System.out.println("表单项的name属性值=" + fileItem.getFieldName());
                        System.out.println("表单项的value属性值=" + fileItem.getString("UTF-8"));

                    } else {
                        //如果是上传的文件类型
                        System.out.println("表单项的name属性值=" + fileItem.getFieldName());
                        System.out.println("表单项的上传文件名=" + fileItem.getName());
                        fileItem.write(new File("/Users/cmm/upload/" + fileItem.getName()));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet...");
    }
}

1.2.3 配置web.xml文件中的动态资源访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>DownloadServlet</servlet-name>
        <servlet-class>com.wind.servlet.DownloadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>UploadServlet</servlet-name>
        <url-pattern>/uploadServlet</url-pattern>
    </servlet-mapping>

</web-app>

1.2.4 文件上传测试

(1)客户端填写信息

(2)上传完成之后本地磁盘已经出现上传的文件

(3)Tomcat服务器的输出

1.2.2-1 文件上传时客户端发送的HTTP协议内容格式

1.2.2-2 文件上传时需要使用的jar包说明: commons-fileupload常用API

(1)针对文件上传时客户端发送的HTTP协议内容格式,已经有比较成熟的第三方jar包供我们使用。

(2)jar下载地址https://mvnrepository.com/ 

2、文件下载

2.1 文件下载整体项目结构

2.2 编写一个用于下载的动态Servlet处理器

package com.wind.servlet;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
 * 用于测试下载
 */
public class DownloadServlet extends HttpServlet {

    private static final long serialVersionUID = 8594037586209694672L;

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet...");
        //1.获取要下载的文件名(这里就直接hardcode了)
        String downloadFileName = "2.jpg";
        /**
         * 斜杠 / :在服务器端被解析为:http://ip:port/工程项目/,映射到IDEA代码中的WEB目录
         */
        String downloadFilePath = "/WEB-INF/file/" + downloadFileName;

        //2.读取要下载的文件内容(通过ServletContext对象可以读取)
        ServletContext servletContext = getServletContext();

        //3.读取要下载的文件类型
        String mimeType = servletContext.getMimeType(downloadFilePath);

        //4.在回传前,需要通过响应头告知客户端服务器返回的数据类型
        response.setContentType(mimeType);

        //5.还要通过响应头告知客户端,你收到的数据是用于下载还是用于页面展示
        //Content-Disposition:响应头,表示客户端收到的数据该怎么处理
        //attachment:表示是附件,用于下载
        //filename:表示指定下载的文件名
        //如果filename含有中文则会乱码,解决:URL编码是把中文转换为%xx%xx的格式
        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("中国.jpg", "UTF-8"));
        //response.setHeader("Content-Disposition", "attachment; filename=" + downloadFileName);

        //6.把下载的文件内容回传给客户端
        InputStream resourceAsStream = servletContext.getResourceAsStream(downloadFilePath);
        //获取响应的输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //读取输入流中的全部数据,复制给输出流,并且返给客户端
        IOUtils.copy(resourceAsStream, outputStream);
    }
}

2.3 在web.xml文件中配置Servlet的访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>DownloadServlet</servlet-name>
        <servlet-class>com.wind.servlet.DownloadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DownloadServlet</servlet-name>
        <url-pattern>/downloadServlet</url-pattern>
    </servlet-mapping>

</web-app>

2.4 在Tomcat服务器中预先放置好静态资源

2.5 前端浏览器访问下载链接看下载效果

2.6 不同浏览器对中文编码的解决问题

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/111461978
今日推荐