[SpringMVC] Upload e download de arquivo, uso JREBEL

Índice

I. Introdução

2. Carregamento de arquivo

1. Upload de arquivo único

1.1. Preparação da ficha técnica

1.2. Adicionar dependências

1.3. Arquivo de configuração

1.4. Formulários de escrita

1.5. Escreva a camada controladora

2. Upload de vários arquivos

2.1. Escreva o formulário

2.2. Escreva a camada controladora

2.3. Teste

3. Download de arquivo

4. Uso do JREBEL

1. Baixe e registre-se

2. Configurações off-line


I. Introdução

Por que usar upload e download de arquivos? efeito?

O upload e download de arquivos SpringMVC é uma função comum que permite aos usuários fazer upload de arquivos para o servidor ou baixar arquivos do servidor. Este é um recurso essencial para muitas aplicações web, como armazenamento online, sistemas de gerenciamento de documentos, etc. SpringMVC fornece algumas anotações e APIs convenientes que tornam o upload e download de arquivos muito simples. Em termos de upload de arquivos, SpringMVC fornece anotação @RequestParam e classe MultipartFile para lidar facilmente com arquivos carregados. Em termos de download de arquivos, SpringMVC fornece a classe ResponseEntity , que pode enviar arquivos ao cliente como resposta.

2. Carregamento de arquivo

1. Upload de arquivo único

1.1. Preparação da ficha técnica

Também é possível utilizá-lo de acordo com sua própria tabela, serve apenas para salvar dados.

1.2. Adicionar dependências

Adicione dependências de upload de arquivo em pom.xml em seu spring mvc

<dependencies>        
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>${commons-fileupload.version}</version>
        </dependency>
</dependencies>

1.3. Arquivo de configuração

Adicione configuração em seu próprio arquivo spring-mvc.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 文件最大大小(字节) 1024*1024*50=50M-->
    <property name="maxUploadSize" value="52428800"></property>
    <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
    <property name="resolveLazily" value="true"/>
</bean>

Abaixo forneço minha configuração de arquivo

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.3.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--1) 扫描com.tgq及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    <context:component-scan base-package="com.tgq"/>

    <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven/>

    <!--3) 创建ViewResolver视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--4) 单独处理图片、样式、js等资源 -->
    <!--        <mvc:resources location="/static/" mapping="/static/**"/>-->
    <!--    处理文件上传下载问题-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 文件最大大小(字节) 1024*1024*50=50M-->
        <property name="maxUploadSize" value="52428800"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>
    <!--  处理controller层发送请求到biz,会经过切面的拦截处理  -->
    <aop:aspectj-autoproxy/>
</beans>

1.4. Formulários de escrita

O método de envio do formulário é method="post" e enctype="multipart/form-data"

<%--
  Created by IntelliJ IDEA.
  User: tgq
  Date: 9/9/2023
  Time: 下午2:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/sc/upload" method="post" enctype="multipart/form-data">
    <label>编号:</label><input type="text" name="cid" readonly="readonly" value="${param.cid}"/><br/>
    <label>图片:</label><input type="file" name="zx"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>

O nome da imagem carregada não pode ser igual ao nome da coluna da tabela do banco de dados , mas deve ser igual ao nome do código de back-end.

1.5. Escreva a camada controladora

@Controller
@RequestMapping("/sc")
public class StrutsClasController {

    @Autowired
    private StrutsClasBiz strutsClasBiz;

 /**
     * 文件上传
     * <p>
     * //     * @param req
     * //     * @param strutsClas
     *
     * @param zx
     * @return
     */
    @RequestMapping(value = "/upload")
    public String upload(StrutsClas strutsClas, MultipartFile zx) {
//    public String upload(HttpServletRequest req, StrutsClas strutsClas, MultipartFile pic) {
        try {
            //思路:
            //1) 将上传图片保存到服务器中的指定位置
//            本地保存地址
//            String dir = PropertiesUtil.getValue("dir");
              String dir="d:/";
//            网络保存地址/upload/
//            String server = PropertiesUtil.getValue("server");
              String server="/upload/";
//            文件名
            String filename = zx.getOriginalFilename();
//            System.out.println("文件名:" + filename);
//            文件类别
//            System.out.println("文件类别" + zx.getContentType());
            System.out.println(strutsClas);
            FileUtils.copyInputStreamToFile(zx.getInputStream(), new File(dir + filename));
            //2) 更新数据库表t_struts_class图片记录
            strutsClas.setPic(server + filename);
            strutsClasBiz.updateByPrimaryKeySelective(strutsClas);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }
}

Ao configurar o Tomcat, lembre-se de adicionar mapeamento de endereço de upload

2. Upload de vários arquivos

2.1. Escreva o formulário

<form method="post" action="/sc/uploads" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="submit">上传</button>
</form>

2.2. Escreva a camada controladora

 /**
     * 多文件上传
     *
     * @param req
     * @param clas
     * @param files
     * @return
     */
    @RequestMapping("/uploads")
    public String uploads(HttpServletRequest req,MultipartFile[] files) {
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile cfile : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = "D:/temp/upload/";
                String server = "/upload/";
                String filename = cfile.getOriginalFilename();
                FileUtils.copyInputStreamToFile(cfile.getInputStream(), new File(dir + filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

2.3. Teste

Mas quando selecionamos vários arquivos para upload,

nossos arquivos locais ficam vazios.


Quando fizermos o upload, ele será carregado localmente

O mesmo se aplica ao nosso banco de dados

3. Download de arquivo

Opere de acordo com sua própria tabela

<a href="${pageContext.request.contextPath }/sc/download?cid=${b.cid}">下载图片</a>

Escreva o método da camada do controlador

/**
     * 文件下载
     *
     * @param strutsClas
     * @param req
     * @return
     */
    @RequestMapping(value = "/download")
    public ResponseEntity<byte[]> download(StrutsClas strutsClas, HttpServletRequest req) {

        try {
            //先根据文件id查询对应图片信息
            StrutsClas strutsClas1 = this.strutsClasBiz.selectByPrimaryKey(strutsClas.getCid());
//需要下载的地址
            String diskPath = PropertiesUtil.getValue("dir");
//服务器里面保存图片的地址
            String reqPath = PropertiesUtil.getValue("server");
            String realPath = strutsClas1.getPic().replace(reqPath, diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/") + 1);
            //下载关键代码
            File file = new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

Ele será baixado quando clicarmos em download

4. Uso do JREBEL

1. Baixe e registre-se

Procure o plug-in JRebel e baixe-o. Após a instalação bem-sucedida, você será solicitado a reiniciar. Após reiniciar, pressione o botão de operação.

Registre-se na caixa pop-up

Preencha http://127.0.0.1:8888/GUID no primeiro    

GUID: Mude para GUID e preencha o ID   gerado no arquivo online

Confirmação final da inscrição

Comece seu agente. Então execute o JRebel

2. Configurações off-line

Entre em nossas configurações, a premissa é que precisamos iniciar nosso agente para realizar esta operação

Acho que você gosta

Origin blog.csdn.net/weixin_74383330/article/details/132776908
Recomendado
Clasificación