javaWeb-5-Carga y descarga de archivos

Tabla de contenido

1. Carga de archivos

1.1 Pasos para cargar archivos

1.2 Demostración de código de la estructura del proyecto de carga de archivos

1.2.1 Escriba una página frontal para la operación de carga: upload.html

1.2.2 Escribir un procesador de recursos dinámicos back-end: UploadServlet

1.2.3 Configurar la ruta de acceso a recursos dinámicos en el archivo web.xml

1.2.4 Prueba de carga de archivos

1.2.2-1 Formato de contenido del protocolo HTTP enviado por el cliente durante la carga del archivo

1.2.2-2 Descripción del paquete jar que se usa al cargar archivos: commons-fileupload API común

2. Descarga de archivos

2.1 Descarga de archivos estructura general del proyecto

2.2 Escribir un procesador de servlet dinámico para descargar

2.3 Configure la ruta de acceso del servlet en el archivo web.xml

2.4 Colocar previamente recursos estáticos en el servidor Tomcat

2.5 Visite el enlace de descarga en el navegador front-end para ver el efecto de descarga

2.6 Resolviendo el problema de la codificación china por diferentes navegadores

1. Carga de archivos

1.1 Pasos para cargar archivos

1.2 Demostración de código de la estructura del proyecto de carga de archivos

1.2.1 Escriba una página frontal para la operación de carga: 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 Escribir un procesador de recursos dinámicos back-end: 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 Configurar la ruta de acceso a recursos dinámicos en el archivo 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 Prueba de carga de archivos

(1) El cliente completa la información

(2) El archivo cargado apareció en el disco local después de que se completó la carga

(3) La salida del servidor Tomcat

1.2.2-1 Formato de contenido del protocolo HTTP enviado por el cliente durante la carga del archivo

1.2.2-2 Descripción del paquete jar que se usa al cargar archivos: commons-fileupload API común

(1) Para el formato de contenido del protocolo HTTP enviado por el cliente durante la carga del archivo, ya existen paquetes jar de terceros maduros que podemos usar.

(2) La dirección de descarga del jar : https://mvnrepository.com/ 

2. Descarga de archivos

2.1 Descarga de archivos estructura general del proyecto

2.2 Escribir un procesador de servlet dinámico para descargar

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 Configure la ruta de acceso del servlet en el archivo 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>DownloadServlet</servlet-name>
        <url-pattern>/downloadServlet</url-pattern>
    </servlet-mapping>

</web-app>

2.4 Colocar previamente recursos estáticos en el servidor Tomcat

2.5 Visite el enlace de descarga en el navegador front-end para ver el efecto de descarga

2.6 Resolviendo el problema de la codificación china por diferentes navegadores

 

 

Supongo que te gusta

Origin blog.csdn.net/cmm0401/article/details/111461978
Recomendado
Clasificación