10 minutos para aprender o armazenamento de objetos Ali OSS

I. Introdução

Recentemente, muitos amigos perguntaram: o que devemos fazer se quisermos armazenar arquivos em grande escala?

Na verdade, existem muitas tecnologias para armazenamento de arquivos. Se pesquisarmos na Internet, você descobrirá que existem várias tecnologias. Por exemplo, existe uma tecnologia chamada FastDFS que pode realizar o armazenamento de arquivos, mas esta solução requer um servidor autoconstruído , o que é muito problemático.

Na verdade, muitas empresas agora estão usando a tecnologia Tencent Cloud ou Alibaba Cloud. Por exemplo, Alibaba Cloud fornece tecnologia de armazenamento de objetos OSS. Essa tecnologia é segura, confiável e fácil de usar. Leva apenas 10 minutos para começar com o armazenamento. O que? Você não acredita? ! Em seguida, siga o irmão Jian passo a passo, se o irmão Jian levar 10 minutos para concluir o armazenamento do arquivo, você pode me dar um sinal de positivo!

2. Análise do papel do armazenamento de objetos OSS

Antes de aprender a implementação específica do OSS, vamos entender brevemente o que é OSS.

OSS de armazenamento de objetos Aliyun, simplesmente, gastamos dinheiro para comprar um espaço de armazenamento no Alibaba e, em seguida, podemos armazenar vários recursos de arquivo, como fotos, áudio, vídeo, etc., no servidor OSS de armazenamento de objetos. Em seguida, o servidor OSS de armazenamento de objetos pode carregar, baixar e excluir esses arquivos para o pessoal autorizado.

Assim, com o OSS, economizamos uma série de operações tediosas, como comprar servidores de armazenamento de hardware, construir servidores de armazenamento e operar e gerenciar servidores de armazenamento.

Com esses entendimentos básicos, podemos começar a usar o OSS. Claro, primeiro temos que comprar o serviço OSS!

3. Registro e configuração de OSS de armazenamento de objetos

Endereço do site oficial do Alibaba Cloud Object Storage OSS:

Object Storage OSS_Cloud Storage Service_Enterprise Data Management_Storage-Alibaba Cloud

3.1 Cadastro e login

Depois de entrar no site oficial do Alibaba Cloud, a primeira coisa é se registrar e fazer login. Podemos fazer login com nossa conta Alipay, escanear o código no cliente móvel Aliyun ou fazer login com a senha da conta. fornece vários métodos de login. Basicamente, os produtos Alipay podem ser usados ​​universalmente com sua própria conta Alipay.

3.2 Ative o serviço OSS de armazenamento de objetos

Primeiro, encontramos o serviço OSS de armazenamento de objetos do Alibaba Cloud e clicamos para entrar.

imagem.png

Clique no botão Ativar para ativar o serviço OSS de armazenamento de objetos.

imagem.png

3.3 Consola de Gestão

Depois de se registrar, fazer login e ativar o serviço OSS, clique no console de gerenciamento para entrar na interface do console.

imagem.png

Em seguida, entre na interface do console.

imagem.png

Aqui precisamos primeiro criar um Bucket, clicar no menu Bucket list, clicar no botão Create Bucket e então preencher o seguinte conteúdo. Todos devem ficar atentos que o nome do Bucket deve ser único e não pode ser repetido.

imagem.png

imagem.png

3.4 Carregar fotos usando o console

Após a criação do bucket, podemos usar o console para fazer upload de arquivos para teste. A operação de upload é a seguinte:

imagem.png

O resultado do upload bem-sucedido de uma imagem é o seguinte:

imagem.png

4. Implementação do código

Claro, quando estamos desenvolvendo, definitivamente não iremos fazer upload de arquivos manualmente dessa forma, principalmente usando código para implementar.

4.1 Construir o ambiente do projeto

Vamos criar um projeto primeiro, o nome é aliyunossDemo. Aqui estamos obviamente usando o Maven para criar projetos. Lembre-se de não optar por usar o esqueleto que vem com o Maven.

Em seguida, importe pacotes dependentes em 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 Ferramentas de encapsulamento

Crie o pacote com.qianfeng.util e coloque-o na classe de ferramenta de operação de arquivo 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 upload de arquivos

Implementamos o upload de arquivos no 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 upload de fotos e retorno do caminho de acesso

Nesse caso, mostramos como obter o caminho de acesso retornado.

/**
 * 上传图片并返回上传后的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 exclusão de arquivos

Este é um exemplo de exclusão de arquivos enviados.

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

Qianfeng Education Java Introduction Conjunto completo de tutoriais em vídeo (tecnologia de núcleo java, adequado para java zero Foundation, necessário para auto-estudo de Java)

Acho que você gosta

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