Resumen de aprendizaje de Spring MVC (ocho): carga y descarga de archivos

1. La forma tradicional de subir archivos

(1) Importe el paquete jar

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

(2) Escriba un formulario de carga de archivos en index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
   
</head>
<body>
<h3>传统方式文件上传</h3>
<form method="post" action="${pageContext.request.contextPath }/user/uploadFile01" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload"><br>
    <input type="submit" value="上传">
</form>
</body>
</html>

Nota:

a. La etiqueta <input type = "file" /> mostrará un cuadro de entrada y un botón en el navegador. El cuadro de entrada permite al usuario completar el nombre del archivo y la ruta del archivo local. El botón permite al navegador para abrir un cuadro de selección de archivo para El usuario selecciona un archivo.

b. El atributo enctype del formulario especifica el método de codificación de los datos del formulario. Este atributo tiene los siguientes 3 valores.

  • application / x-www-form-urlencoded: este es el método de codificación predeterminado, que solo procesa el valor del atributo value en el campo del formulario.
  • multipart / form-data: este método de codificación procesa los datos del formulario en una secuencia binaria y encapsula el contenido del archivo especificado en el dominio del archivo en los parámetros de solicitud.
  • text / plain: Este método de codificación solo se utiliza cuando el atributo action del formulario tiene el formato "mailto:" URL. Es principalmente adecuado para enviar correos electrónicos directamente a través del formulario.

 

 (3) Agregue un método en UserConrtoller.

    @RequestMapping("/uploadFile01")
    public String uploadFile01(HttpServletRequest request) throws Exception {
        System.out.println("传统方式文件上传");
        //文件上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        File file = new File(path);
        //文件夹不存在则创建文件夹
        if(!file.exists()){
            file.mkdirs();
        }
        //解析request对象,获取文件上传项
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(fileItemFactory);

        List<FileItem> items = upload.parseRequest(request);
        for(FileItem item : items){
            //判断当前item对象是否为文件上传项
            if(!item.isFormField()){
                //获取文件名称
                String fileName = item.getName();
                String uuid = UUID.randomUUID().toString().replace("-","");
                fileName = uuid + "_" + fileName;
                //完成文件上传
                item.write(new File(path, fileName));
                //删除临时文件
                item.delete();
            }
        }
        return "success";
    }

(4) Cree un directorio de páginas en WEB-INF y cree un archivo success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>文件上传成功</h3>
</body>
</html>

 (5) Inicie el proyecto, seleccione el archivo y cargue la prueba.

Dos, Spring MVC realiza la carga de un solo archivo

En el marco Spring MVC, la información y las operaciones relacionadas con el archivo se encapsulan en un objeto MultipartFile cuando se carga un archivo, por lo que solo se necesita la clase MultipartFile para completar la operación de carga del archivo.

(1) Agregue un formulario en index.jsp.

<h3>Spring MVC方式文件上传</h3>
<form method="post" action="${pageContext.request.contextPath }/user/uploadFile02" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload"><br>
    <input type="submit" value="上传">
</form>

(2) Configure MultipartResolver en web.xml para cargar archivos.

<!--  配置文件解析器对象,要求id名必须为 multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

(3) El método de agregar tratamiento.

    @RequestMapping("/uploadFile02")
    public String uploadFile02(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("Spring MVC方式文件上传");
        //获取文件上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        File file = new File(path);
        //文件夹不存在则创建文件夹
        if(!file.exists()){
            file.mkdirs();
        }
        //获取要上传的文件的名称
        String fileName = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        fileName = uuid + "_" + fileName;
        upload.transferTo(new File(file, fileName));
        return "success";
    }

(4) Inicie el proyecto, seleccione el archivo y cargue la prueba.

 tengo que ser consciente de es

a. El nombre del atributo de nombre de la etiqueta de archivo en el formulario debe ser el mismo que el nombre de la variable del parámetro de entrada, de la siguiente manera:

b. Configure el objeto de resolución de archivos, el nombre de id debe ser multipartResolver

Tres, Spring MVC se da cuenta de la carga de múltiples archivos

(1) Agregue un formulario en index.jsp.

<h3>Spring MVC多文件上传</h3>
<form action="${pageContext.request.contextPath }/user/multiFileUpload"
      method="post" enctype="multipart/form-data">
    选择文件1:<input type="file" name="myFile"><br>
    文件描述1:<input type="text" name="description"><br />
    选择文件2:<input type="file" name="myFile"><br>
    文件描述2:<input type="text" name="description"><br />
    选择文件3:<input type="file" name="myFile"><br>
    文件描述3:<input type="text" name="description"><br />
    <input type="submit" value="提交">
</form>

(2) Agregue la clase pojo.

public class MultiFileMsg {
    private List<String> description;
    private List<MultipartFile> myFile;

    public List<String> getDescription() {
        return description;
    }

    public void setDescription(List<String> description) {
        this.description = description;
    }

    public List<MultipartFile> getMyFile() {
        return myFile;
    }

    public void setMyFile(List<MultipartFile> myFile) {
        this.myFile = myFile;
    }

    @Override
    public String toString() {
        return "MultiFileMsg{" +
                "description=" + description +
                ", myFile=" + myFile +
                '}';
    }
}

(3) Agregar método de procesamiento

  @RequestMapping("/multiFileUpload")
    public String multiFileUpload(HttpServletRequest request, @ModelAttribute MultiFileMsg multiFileMsg) throws Exception {
        System.out.println("Spring MVC多文件上传");
        //获取文件上传的位置
        String realpath = request.getSession().getServletContext().getRealPath("/uploads");
        File targetDir = new File(realpath);
        //文件夹不存在则创建文件夹.
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }
        List<MultipartFile> files = multiFileMsg.getMyFile();
        for (int i = 0; i < files.size(); i++) {
            MultipartFile file = files.get(i);
            String fileName = file.getOriginalFilename();
            File targetFile = new File(realpath, fileName);
            // 上传
            try {
                file.transferTo(targetFile);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "success";
    }

(4) Modificar la página success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>文件上传成功</h3>
<table border="1px">
    <tr>
        <td>详情</td>
        <td>文件名</td>
    </tr>
<%--    <!-- 同时取两个数组的元素 -->--%>
    <c:forEach items="${multiFileMsg.description}" var="description"
               varStatus="loop">
        <tr>
            <td>${description}</td>
            <td>${multiFileMsg.myFile[loop.count-1].originalFilename}</td>
        </tr>
    </c:forEach>
    <!-- fileDomain.getMyfile().getOriginalFilename() -->
</table>
</body>
</html>

(5) Inicie el proyecto, seleccione el archivo y cargue la prueba.

Cuatro, descarga del archivo de implementación de Spring MVC

La descarga mediante el programa requiere los siguientes dos informes:

(1) El servidor web debe indicarle al navegador que el tipo de contenido de salida no es un archivo de texto normal o un archivo HTML, sino un archivo de descarga que se guardará localmente, por lo que debe set Content: el valor de Type es application / x-msdownload.

(2) El servidor web espera que el navegador no procese directamente el contenido de la entidad correspondiente, pero el usuario elige guardar el contenido de la entidad correspondiente en un archivo, por lo que se debe configurar el encabezado Content-Disposition.

Este encabezado especifica la forma en que el programa receptor procesa el contenido de los datos. En las aplicaciones HTTP, solo el adjunto es la forma estándar y adjunto significa que se requiere la intervención del usuario. También puede especificar el parámetro de nombre de archivo después del archivo adjunto, que es el nombre del archivo que el servidor recomienda que el navegador guarde el contenido de la entidad en el archivo.

Un ejemplo de configuración del encabezado es el siguiente:

response.setHeader ("Tipo de contenido", "aplicación / x-msdownload");
response.setHeader ("Content-Disposition", "adjunto; nombre de archivo =" + nombre de archivo);

(1) Escriba la clase de controlador FileDownloadController

Hay 3 métodos en FileDownloadController, a saber, showAllDownFiles, downloadFiles y toUTF8String. Entre ellos, el método showAllDownFiles obtiene el nombre del archivo descargado; el método downloadFiles realiza la función de descarga; el método toUTF8String es el método de conversión de codificación de caracteres del nombre del archivo chino al descargar y guardar.

@Controller
public class FileDownloadController {
    /**
     * 显示要下载的文件
     */
    @RequestMapping("showAllDownFiles")
    public String showAllDownFiles(HttpServletRequest request, Model model) {
        // 从 upload下载
        String realpath = request.getServletContext()
                .getRealPath("uploads");
        File dir = new File(realpath);
        File files[] = dir.listFiles();
        // 获取该目录下的所有文件名
        ArrayList<String> fileName = new ArrayList<String>();
        for (int i = 0; i < files.length; i++) {
            fileName.add(files[i].getName());
        }
        model.addAttribute("files", fileName);
        return "showAllFiles";
    }

    /**
     * 执行下载
     */
    @RequestMapping("downloadFile")
    public String downloadFile(@RequestParam String filename,
                       HttpServletRequest request, HttpServletResponse response) {
        String aFilePath = null; // 要下载的文件路径
        FileInputStream in = null; // 输入流
        ServletOutputStream out = null; // 输出流
        try {
            // 从workspace\.metadata\.plugins\org.eclipse.wst.server.core\
            // tmp0\wtpwebapps下载
            aFilePath = request.getServletContext().getRealPath("uploads");
            // 设置下载文件使用的报头
            response.setHeader("Content-Type", "application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename="
                    + toUTF8String(filename));
            // 读入文件
            in = new FileInputStream(aFilePath + "\\" + filename);
            // 得到响应对象的输出流,用于向客户端输出二进制数据
            out = response.getOutputStream();
            out.flush();
            int aRead = 0;
            byte b[] = new byte[1024];
            while ((aRead = in.read(b)) != -1 & in != null) {
                out.write(b, 0, aRead);
            }
            out.flush();
            in.close();
            out.close();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 下载保存时中文文件名的字符编码转换方法
     */
    public String toUTF8String(String str) {
        StringBuffer sb = new StringBuffer();
        int len = str.length();
        for (int i = 0; i < len; i++) {
            // 取出字符中的每个字符
            char c = str.charAt(i);
            // Unicode码值为0~255时,不做处理
            if (c >= 0 && c <= 255) {
                sb.append(c);
            } else { // 转换 UTF-8 编码
                byte b[];
                try {
                    b = Character.toString(c).getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    b = null;
                }
                // 转换为%HH的字符串形式
                for (int j = 0; j < b.length; j++) {
                    int k = b[j];
                    if (k < 0) {
                        k &= 255;
                    }
                    sb.append("%" + Integer.toHexString(k).toUpperCase());
                }
            }
        }
        return sb.toString();
    }
}

(2) Cree la página de lista de archivos showAllFiles.jsp.

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<table>
    <tr>
        <td>被下载的文件名</td>
    </tr>
    <!--遍历 model中的 files-->
    <c:forEach items="${files}" var="filename">
        <tr>
            <td>
                <a href="${pageContext.request.contextPath }/downloadFile?filename=${filename}">${filename}</a>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

 (3) Inicie el proyecto, seleccione el archivo, pruébelo y visite: http: // localhost: 8080 / SpringMVCStudy02_war / showDownFiles . El resultado de la ejecución es el siguiente, haga clic para descargar.

Supongo que te gusta

Origin blog.csdn.net/weixin_47382783/article/details/113600276
Recomendado
Clasificación