10 minutos para aprender el almacenamiento de objetos Ali OSS

I. Introducción

Recientemente, muchos amigos han preguntado, ¿qué debemos hacer si queremos almacenar archivos de gran tamaño?

De hecho, hay muchas tecnologías para el almacenamiento de archivos, si buscamos en Internet, encontrará que hay varias tecnologías, por ejemplo, hay una tecnología llamada FastDFS que puede realizar el almacenamiento de archivos, pero esta solución requiere un servidor construido por sí mismo. , que es muy problemático.

De hecho, muchas empresas ahora utilizan la tecnología Tencent Cloud o Alibaba Cloud. Por ejemplo, Alibaba Cloud proporciona tecnología de almacenamiento de objetos OSS. Esta tecnología es segura, confiable y fácil de usar. Solo toma 10 minutos comenzar con el almacenamiento. ¿Qué? ¿Tú no crees? ! Luego, siga al hermano Jian paso a paso, si el hermano Jian le toma 10 minutos para completar el almacenamiento de archivos, ¡puede darme un visto bueno!

2. Análisis del papel del almacenamiento de objetos OSS

Antes de aprender la implementación específica de OSS, comprendamos brevemente qué es OSS.

Aliyun object storage OSS, en pocas palabras, gastamos dinero para comprar un espacio de almacenamiento en Alibaba, y luego podemos almacenar varios recursos de archivos como imágenes, audio, video, etc. en el servidor de almacenamiento de objetos OSS. Luego, el servidor OSS de almacenamiento de objetos puede cargar, descargar y eliminar estos archivos para el personal autorizado.

Entonces, con OSS, nos ahorramos una serie de operaciones tediosas, como comprar servidores de almacenamiento de hardware, construir servidores de almacenamiento y operar y administrar servidores de almacenamiento.

Con estos conocimientos básicos, podemos comenzar a usar OSS. ¡Por supuesto, primero tenemos que comprar el servicio OSS!

3. Registro y configuración de OSS de almacenamiento de objetos

Alibaba Cloud Object Storage OSS dirección del sitio web oficial:

Almacenamiento de objetos OSS_Servicio de almacenamiento en la nube_Gestión de datos empresariales_Almacenamiento-Alibaba Cloud

3.1 Registro e inicio de sesión

Tras entrar en la web oficial de Alibaba Cloud, lo primero es registrarse e iniciar sesión. Podemos iniciar sesión con nuestra cuenta de Alipay, escanear el código en el cliente móvil de Aliyun o iniciar sesión con la contraseña de la cuenta. En definitiva, Alibaba Cloud proporciona múltiples métodos de inicio de sesión. Básicamente, los productos de Alipay se pueden usar universalmente con su propia cuenta de Alipay.

3.2 Activar el servicio OSS de almacenamiento de objetos

Primero, encontramos el servicio OSS de almacenamiento de objetos de Alibaba Cloud y hacemos clic para ingresar.

imagen.png

Haga clic en el botón Activar para activar el servicio OSS de almacenamiento de objetos.

imagen.png

3.3 Consola de administración

Después de registrarse, iniciar sesión y activar el servicio OSS, haga clic en la consola de administración para ingresar a la interfaz de la consola.

imagen.png

Luego ingrese a la interfaz de la consola.

imagen.png

Aquí primero debemos crear un depósito, hacer clic en el menú de la lista de depósitos, hacer clic en el botón Crear depósito y luego completar el siguiente contenido. Todos deben prestar atención a que el nombre del Cubo debe ser único y no se puede repetir.

imagen.png

imagen.png

3.4 Subir fotos usando la consola

Después de crear el depósito, podemos usar la consola para cargar archivos para probar. La operación de carga es la siguiente:

imagen.png

El resultado de cargar con éxito una imagen es el siguiente:

imagen.png

4. Implementación del código

Por supuesto, cuando estemos desarrollando, definitivamente no cargaremos archivos manualmente de esta manera, principalmente usando código para la implementación.

4.1 Construir el entorno del proyecto

Primero creemos un proyecto, el nombre es aliyunossDemo. Aquí estamos, por supuesto, usando Maven para crear proyectos. Recuerde no elegir usar el esqueleto que viene con Maven.

A continuación, importe los paquetes dependientes en pom.xml.

<!-- 继承Spring boot工程 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.5.RELEASE</version>
</parent>

<properties>
    <!-- 项目源码及编译输出的编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <!-- 项目编译JDK版本 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <!-- 依赖包版本管理 -->
    <spring.boot.version>2.1.5.RELEASE</spring.boot.version>
    <aliyun-oss-version>3.10.2</aliyun-oss-version>
    <httpcore-verison>4.4.3</httpcore-verison>
    <httpclient-version>4.5.1</httpclient-version>
</properties>

<dependencies>
    <!-- Spring boot starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>${aliyun-oss-version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>${httpcore-verison}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${httpclient-version}</version>
    </dependency>
</dependencies>
注意,如果你的JDK是1.9或者以上版本,需要加入jaxb相关依赖,其他JDK版本不需要!

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

然后我们在resources目录下创建一个application.yml配置文件。
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  application:
    name: aliyun-oss-demo
server:
  port: 9001
aliyun:
  oss:
    #服务器地址, 我选择的是华北2-北京地址如下
    endpoint: http://oss-cn-beijing.aliyuncs.com
    #子账户名称,在自己控制台账户的Access中查看
    accessKeyId: 填写自己的accessKey
    #子账户密码
    accessKeySecret: 填写自己的accessSecret
    #自己创建的桶的名字
    bucketName: qianfeng-file
   

 接着我们创建一个启动类AliyunOssApplication。
package com.qianfeng;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 微服务启动类
 * @Author 千锋健哥
 */
@SpringBootApplication
public class AliyunOssApplication {

    public static void main(String[] args) {
        SpringApplication.run(AliyunOssApplication.class, args);
    }
}

4.2 Herramientas de encapsulación

Cree el paquete com.qianfeng.util y colóquelo en la clase de herramienta de operación de archivos AliyunOSSUtil.

package com.qianfeng.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Date;

/**
 * 阿里云OSS上传,下载, 删除文件工具类
 * @Author 千锋健哥
 */
public class AliyunOSSUtil {

    /**
     * byte数组格式上传文件
     * @param endpoint          OSS对外服务的访问域名
     * @param accessKeyId       accessKey账号
     * @param accessKeySecret   accessKey密码
     * @param bucketName        桶名字
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @param content           文件内容, byte数组格式
     * @Author 千锋健哥
     */
    public static void uploadByByteArrayFile(String endpoint,
                                             String accessKeyId,
                                             String accessKeySecret,
                                             String bucketName,
                                             String objectName,
                                             byte[] content) throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        //创建上传请求对象
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content));

        // 上传
        PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 输入流格式上传文件
     * @param endpoint          OSS对外服务的访问域名
     * @param accessKeyId       accessKey账号
     * @param accessKeySecret   accessKey密码
     * @param bucketName        桶名字
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @param content           文件内容, 输入流格式
     * @Author 千锋健哥
     */
    public static void uploadByInputStreamFile(String endpoint,
                                               String accessKeyId,
                                               String accessKeySecret,
                                               String bucketName,
                                               String objectName,
                                               InputStream content) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传
        ossClient.putObject(bucketName, objectName, content);
        // 关闭OSSClient
        ossClient.shutdown();
    }

    /**
     * byte数组格式上传文件并返回上传后的URL地址
     * @param endpoint          OSS对外服务的访问域名
     * @param accessKeyId       accessKey账号
     * @param accessKeySecret   accessKey密码
     * @param bucketName        桶名字
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @param content           文件内容, byte数组格式
     * @Author 千锋健哥
     */
    public static String uploadImage(String endpoint,
                              String accessKeyId,
                              String accessKeySecret,
                              String bucketName,
                              String objectName,
                              byte[] content)  throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 创建上传文件的元信息,可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType("image/jpg");
        // 文件上传
        ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content), objectMetadata);
        // 设置URL过期时间为1小时。
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
        //返回url地址
        String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
        //关闭OSSClient。
        ossClient.shutdown();
        return url;
    }

    /**
     * 下载文件到本地
     * @param endpoint          OSS对外服务的访问域名
     * @param accessKeyId       accessKey账号
     * @param accessKeySecret   accessKey密码
     * @param bucketName        桶名字
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @param localFile         下载到本地文件目录
     * @Author 千锋健哥
     */
    public static void downFile(String endpoint,
                                String accessKeyId,
                                String accessKeySecret,
                                String bucketName,
                                String objectName,
                                String localFile) throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFile));

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 删除文件
     * @param endpoint          OSS对外服务的访问域名
     * @param accessKeyId       accessKey账号
     * @param accessKeySecret   accessKey密码
     * @param bucketName        桶名字
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @Author 千锋健哥
     */
    public static void deleteFile(String endpoint,
                                  String accessKeyId,
                                  String accessKeySecret,
                                  String bucketName,
                                  String objectName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
        ossClient.deleteObject(bucketName, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

4.3 Caso de subir archivos

Implementamos la carga de archivos en Controller.

package com.qianfeng.controller;

import com.qianfeng.util.AliyunOSSUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件管理接口
 * 提供文件各种形式上传, 下载, 删除等操作
 * @Author 千锋健哥
 */
@RestController
@RequestMapping("/file")
public class FileManagerController {

    //OSS服务器访问域名
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    //子账户名
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    //子账户密码
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    //桶名字
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    /**
     * byte数组形式上传
     * @param file
     * @Author 千锋健哥
     */
    @PostMapping("/upload1")
    public void upload(@RequestParam("file") MultipartFile file) throws Exception {
        AliyunOSSUtil.uploadByByteArrayFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());
    }
    
    /**
     * 输入流形式上传
     * @param file
     * @Author 千锋健哥
     */
    @PostMapping("/upload2")
    public void upload2(@RequestParam("file") MultipartFile file) throws Exception {
        AliyunOSSUtil.uploadByInputStreamFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getInputStream());
    }
}

4.4 Caso de cargar imágenes y devolver la ruta de acceso

En este caso, le mostramos cómo obtener la ruta de acceso devuelta.

/**
 * 上传图片并返回上传后的URL地址
 * @param file
 * @Author 千锋健哥
 */
@PostMapping("/upload3")
public String upload3(@RequestParam("file") MultipartFile file) throws Exception {
    String url = AliyunOSSUtil.uploadImage(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());
    System.out.println("===千锋健哥===" + url);
    return url;
}

4.5 Casos de eliminación de archivos

Este es un ejemplo de eliminación de archivos cargados.

/**
 * 删除文件
 * @param objName 需要删除的对象名称
 * @Author 千锋健哥
 */
@DeleteMapping("/delete")
public void deleteFile(String objName) {
    AliyunOSSUtil.deleteFile(endpoint, accessKeyId, accessKeySecret, bucketName, objName);
}

Qianfeng Education Introducción a Java Conjunto completo de tutoriales en video (tecnología central de Java, adecuada para la base cero de Java, necesaria para el autoaprendizaje de Java)

Supongo que te gusta

Origin blog.csdn.net/longz_org_cn/article/details/132201619
Recomendado
Clasificación