Caso SpringBoot: carga de archivos

Tabla de contenido

Introducción

Tres elementos de la página de inicio de carga de archivos

 El servidor recibe el archivo.

resumen

almacenamiento local

lograr

Optimización de código

resumen 

OSS en la nube de Alibaba

Nube de Ali

OSS en la nube de Alibaba

Uso de servicios de terceros: ideas generales

 Preparación

Consulte el código SDK oficial para escribir el programa de entrada.

Uso integrado

Pasos de uso de Alibaba Cloud OSS

Pasos de uso de Alibaba Cloud OSS

Escriba el programa de entrada según el SDK.

Integración de casos OSS (implementación de interfaz de carga de archivos)

 Introducir las herramientas OSS de Alibaba Cloud

clase de control

prueba 

Depuración conjunta de front-end y back-end 

resumen

Introducción a la carga de archivos

Tres elementos de la página de inicio (elemento de formulario de archivo, método de publicación, multiparte/datos de formulario)

Interfaz del servidor para recibir archivos (Multipart)

método de almacenamiento de archivos


Introducción

  • La carga de archivos se refiere al proceso de cargar imágenes, videos, audios y otros archivos locales al servidor para que otros usuarios los exploren o los descarguen.
  • La carga de archivos se usa ampliamente en proyectos. A menudo usamos la función de carga de archivos para publicar en Weibo y Moments.

Tres elementos de la página de inicio de carga de archivos

Archivo de elemento de formulario

método de envío de formulario

formato de codificación del formulario

El resultado de ejecutar la página anterior es:

 El servidor recibe el archivo.

El código de la clase de control es el siguiente:

package com.example.tlias.controller;

import com.example.tlias.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@Slf4j

public class UpLoadController {
    @PostMapping("upload")
    public Result upload(String username, Integer age, MultipartFile image) {
        log.info("文件上传,name:{},age:{},image:{}", username, age, image);
        return Result.success();
    }

}

 Depure y ejecute el proyecto SpringBoot, visite la página de inicio HTML en el navegador y establezca el punto de interrupción del programa. Si no se establece el punto de interrupción, el archivo temporal recibido se eliminará automáticamente después de que se ejecute el programa. Las instrucciones específicas son las siguientes:

Luego visite la página de inicio en el navegador.

Después de hacer clic en Enviar, la terminal del programa muestra lo siguiente:

 Mostrar los datos recibidos desde el front-end y la ubicación donde se almacenan temporalmente los datos

resumen

  • Tres elementos de la portada
    • Tipo de elemento del formulario="archivo"
    • Publicación del método de envío del formulario
    • El atributo enctype del formulario multipart/form-data
  • El servidor recibe wenjian.
    • Archivo multiparte

almacenamiento local

lograr

  • En el lado del servidor, después de recibir el archivo cargado, almacene el archivo en el disco del servidor local.
  • El código de clase de control específico es el siguiente
    • package com.example.tlias.controller;
      
      import com.example.tlias.pojo.Result;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;
      
      import java.io.File;
      import java.io.IOException;
      
      @RestController
      @Slf4j
      
      public class UpLoadController {
          @PostMapping("upload")
          public Result upload(String username, Integer age, MultipartFile image) throws IOException {
              log.info("文件上传,name:{},age:{},image:{}", username, age, image);
              //  todo 获取原始文件名
              String name = image.getOriginalFilename();
              //  todo 将文件存储在服务器指定的磁盘目录中
              image.transferTo(new File("D:\\downloadFile\\" + name));
              return Result.success();
          }
      
      }
      

Prueba con psotman

La ruta de solicitud específica y los parámetros de solicitud son los siguientes

El directorio de archivos correspondiente se muestra de la siguiente manera:

Almacenó exitosamente el archivo pasado por el front-end al disco del servidor local 

Optimización de código

  • Problema existente: cuando el nombre del archivo pasado por el front-end es el mismo, habrá un problema de sobrescritura del archivo.
  • Solución al problema: simplemente restablezca un nuevo nombre para cada archivo recibido. El nuevo nombre se compone de UUID y el sufijo del archivo. El UUID se genera utilizando el aip que viene con Java y el sufijo se obtiene interceptando el nombre original del archivo.
  • El código específico es el siguiente:
    • package com.example.tlias.controller;
      
      import com.example.tlias.pojo.Result;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;
      
      import java.io.File;
      import java.io.IOException;
      import java.util.UUID;
      
      @RestController
      @Slf4j
      
      public class UpLoadController {
          @PostMapping("upload")
          public Result upload(String username, Integer age, MultipartFile image) throws IOException {
              log.info("文件上传,name:{},age:{},image:{}", username, age, image);
              //  todo 获取原始文件名,但是不同文件的原始文件名可能相同
              String name = image.getOriginalFilename();
              // todo 构造唯一文件名--uuid(通用唯一识别码)
              // 获取文件后缀名
              int index = name.lastIndexOf(".");//获取最后的.的索引位置
              String extname = name.substring(index);//进行截取
              String newName = UUID.randomUUID().toString() + extname;//创建唯一文件名
              log.info("获取到的新的文件名为:{}", newName);
              //  todo 将文件存储在服务器指定的磁盘目录中
              image.transferTo(new File("D:\\downloadFile\\" + newName));
              return Result.success();
          }
      
      }
      

Utilice cartero para reenviar la misma solicitud y los resultados son los siguientes:

 

problema resuelto 

En SpringBoot, para cargar archivos, el tamaño máximo predeterminado de un solo archivo es 1 M. Si necesita cargar un archivo grande, puede configurarlo de la siguiente manera

resumen 

  • Cadena getOriginalFilename() --> Obtener el nombre del archivo original
  • void transferTo(Destino del archivo) --> transferir el archivo aceptado al archivo del disco
  • long getSize() -->Obtener tamaño de archivo, unidad byte (byte) 1KB=1024 bytes
  • byte[] getBytes() --> Obtener la matriz de bytes del contenido del archivo
  • InputStream getInputStream() -->Obtener el flujo de entrada del contenido del archivo recibido

OSS en la nube de Alibaba

Nube de Ali

  • Alibaba Cloud es la empresa de computación en la nube líder mundial del Grupo Alibaba y el mayor proveedor de servicios en la nube de China.

OSS en la nube de Alibaba

  • Alibaba Cloud Object Storage OSS (Object Storage Service) es un servicio de almacenamiento en la nube masivo, seguro, de bajo costo y altamente confiable. Usando OSS, se pueden almacenar y recuperar a través de la red en cualquier momento varios archivos, incluidos texto, imágenes, audio y video, etc.

Uso de servicios de terceros: ideas generales

 Preparación

Consulte el código SDK oficial para escribir el programa de entrada.

  • SDK es la abreviatura de Software Development Kit (Kit de desarrollo de software), que es una colección de herramientas, bibliotecas y documentos que se utilizan para desarrollar aplicaciones o plataformas de software específicas. El SDK proporciona las herramientas y los recursos que los desarrolladores necesitan para crear, probar e implementar aplicaciones de software más fácilmente. Los SDK suelen contener compiladores, depuradores, documentación de API, código de muestra y otras herramientas de desarrollo, así como bibliotecas y componentes para interactuar con una plataforma o sistema operativo específico. Los desarrolladores pueden utilizar el SDK para crear aplicaciones, complementos, extensiones u otros componentes de software para integrarlos con software, hardware o servicios específicos.

Uso integrado

Pasos de uso de Alibaba Cloud OSS

Pasos de uso de Alibaba Cloud OSS

Registre Alibaba Cloud --- recarga (opcional) --- servicio de almacenamiento de objetos abierto (OSS) --- creación de depósito --- obtención de AccessKey (clave) --- consulte el SDK oficial para escribir y usar --- integración de casos OSS

  • Cubo: un espacio de almacenamiento es un contenedor para que los usuarios almacenen objetos (objetos, es decir, archivos), todos los objetos deben pertenecer a un determinado espacio de almacenamiento .

Consulte el archivo para conocer los pasos específicos:

[Documentos Tencent] Documentos necesarios para casos SpringBoot
https://docs.qq.com/doc/DUkRiTWVaUmFVck9N

Escriba el programa de entrada según el SDK.

Según la documentación oficial proporcionada por Alibaba Cloud, puede operar

  • Primero instale el JDK de Java
  • Luego realice las operaciones OSS requeridas 

     Simplemente copie el código correspondiente y modifique el código específico según su propia información.

Quiero utilizar la función de carga de archivos, el código específico es el siguiente:

package com.example.tlias;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.FileInputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        // todo 指定OSS服务地址

        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // todo 设置访问凭证

        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        // todo 指定文件所存储的bucket名字(bucketName),以及文件的名称(objectName)

        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        // todo 指定本地要上传的文件

        String filePath = "D:\\localpath\\examplefile.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 

Después de modificar los parámetros específicos, permita el programa Java y los resultados son los siguientes:

ejecutar con éxito 

 Y se establecerá una dirección URL de acceso para cada archivo.

Integración de casos OSS (implementación de interfaz de carga de archivos)

 En la implementación de la nueva función de interfaz de empleado en el caso de los empleados, la carga de la información del avatar del empleado y la implementación de la función de carga de avatar aún no se han implementado. Consulte la interfaz de carga de archivos en el documento de la interfaz. El enlace específico de la El documento de interfaz es el siguiente :

https://hkm-web.oss-cn-beijing.aliyuncs.com/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3

 Introducir las herramientas OSS de Alibaba Cloud

package com.example.tlias.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {

    // todo 指定OSS服务地址
    private String endpoint = "你自己的";
    // todo 设置密钥账号和密码
    private String accessKeyId = "你自己的";
    private String accessKeySecret = "你自己的";
    // todo 设置文件存储buket
    private String bucketName = "你自己的";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

clase de control

package com.example.tlias.controller;

import com.example.tlias.pojo.Result;
import com.example.tlias.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j

public class UpLoadController {
    // todo 文件存储到本地
//    @PostMapping("/upload")
//    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
//        log.info("文件上传,name:{},age:{},image:{}", username, age, image);
//        //  todo 获取原始文件名,但是不同文件的原始文件名可能相同
//        String name = image.getOriginalFilename();
//        // todo 构造唯一文件名--uuid(通用唯一识别码)
//        // 获取文件后缀名
//        int index = name.lastIndexOf(".");//获取最后的.的索引位置
//        String extname = name.substring(index);//进行截取
//        String newName = UUID.randomUUID().toString() + extname;//创建唯一文件名
//        log.info("获取到的新的文件名为:{}", newName);
//        //  todo 将文件存储在服务器指定的磁盘目录中
//        image.transferTo(new File("D:\\downloadFile\\" + newName));
//        return Result.success();
//    }
// todo 文件存储至阿里云OSS
    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传至阿里云,文件名:{}", image.getOriginalFilename());
        // 调用阿里云OSS工具进行文件上传
        String url = aliOSSUtils.upload(image);
        log.info("文件上传完成,文件url地址为:{}", url);
        return Result.success(url);

    }
}

prueba 

Depuración conjunta de front-end y back-end 

 

ejecutar con éxito  

resumen

Introducción a la carga de archivos

Tres elementos de la página de inicio (elemento de formulario de archivo, método de publicación, multiparte/datos de formulario)

Interfaz del servidor para recibir archivos (Multipart)

método de almacenamiento de archivos

  • Almacenamiento local (sin acceso directo, espacio en disco limitado, disco dañado)
  • almacenamiento en la nube OSS

Supongo que te gusta

Origin blog.csdn.net/weixin_64939936/article/details/132383795
Recomendado
Clasificación