文件上传-阿里云OSS

1. 介绍阿里云OSS

阿里云对象存储服务(Object Storage Service,简称OSS)是阿里云提供的海量、安全、低成本、高可靠的云存储服务,致力于为各类网站、移动应用、大型企业等提供文件存储和处理服务。

2. 准备工作 

  • 注册阿里云账号

 登录阿里云官网阿里云-计算,为了无法计算的价值 (aliyun.com),注册账号。

  • 创建并配置OSS Bucket

 点击控制台,进入控制台页面,点击左上角导航栏,弹出左侧菜单,选择对象存储oss,点击开通服务,完成之后,点击Bucket列表,创建Bucakt,进入创建Bucakt页面,自己起一个Bucket名称,重点是读写权限一定要选择公共读,其余默认即可,点击完成创建,完成之后,页面会自动显示刚刚创建的Bucket的基本信息及域名地址,域名地址和Bucket名称在后面写代码时会用到。

  • 生成Access Key和Secret Key

 将鼠标移到右上角的头像,会自动弹出一个下拉框,点击AccessKey管理,进入AccessKey管理页面,选择创建AccessKey,创建AccessKey后会自动生成Access Key和Secret Key,这个一定记得找个地方保存下来,在后面写代码时会用到。

3.安装

 首先,需要在项目的 Maven 配置文件(pom.xml)中添加 PageHelper 的依赖:在Maven工程中使用OSS Java SDK,只需在pom.xml中加入相应依赖即可。以在<dependencies>中加入3.17.4版本的依赖为例:

<dependency> 
    <groupId>com.aliyun.oss</groupId> 
    <artifactId>aliyun-sdk-oss</artifactId> 
    <version>3.17.4</version> 
</dependency>

如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖。添加JAXB相关依赖示例代码如下:

<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>

4.配置 

创建阿里云工具类

package demo.util;

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

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

/**
 * OSS 上传工具类,用于处理文件上传至阿里云 OSS 存储服务。
 */
@Component
public class OssUploadUtil {

    // OSS 服务端点,应替换为实际的 OSS 地址
    private String endpoint = "你自己的域名地址";
    // OSS Bucket 名称,应替换为实际的 Bucket 名称
    private String bucketName = "你自己的";
    // Access Key ID,应替换为实际的 Access Key ID
    private String accessKeyId = "你自己的Access Key ID";
    // Access Key Secret,应替换为实际的 Access Key Secret
    private String accessKeySecret = "你自己的Access Key Secret";

    /**
     * 上传文件到 OSS。
     *
     * @param file 待上传的文件
     * @return 文件的访问 URL
     * @throws IOException 如果文件读取或上传失败
     */
    public String upload(MultipartFile file) throws IOException {
        // 检查文件是否为空
        if (file.isEmpty()) {
            throw new IllegalArgumentException("File must not be empty");
        }

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 获取原始文件名
        String fileName = file.getOriginalFilename();
        // 检查文件名是否有效
        if (fileName == null || fileName.isEmpty()) {
            throw new IllegalArgumentException("File name is invalid");
        }

        // 查找文件名中的最后一个点,用于提取文件扩展名
        int dotIndex = fileName.lastIndexOf(".");
        // 提取文件扩展名
        String extension = "";
        if (dotIndex > 0) { // 确保文件名中存在点,但不包括文件名最后的点
            extension = fileName.substring(dotIndex); // 包括点字符作为扩展名的一部分
        }

        // 生成随机文件名,避免文件覆盖
        String uuid = UUID.randomUUID().toString().replace("-", "") + extension;

        // 创建 OSS 客户端并上传文件
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, uuid, inputStream);

        // 构造文件的访问 URL
        String fullEndpoint = "https://oss-cn-beijing.aliyuncs.com"; // 包含协议头的完整端点
        String url = fullEndpoint.replaceFirst("https?://", "") + "/" + uuid;

        // 关闭 OSS 客户端连接
        ossClient.shutdown();

        // 返回文件的访问 URL
        return url;
    }
}

5.实现 

编写controller层代码

package demo.controller;

import demo.util.OssUploadUtil;
import demo.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * Upload类负责处理文件上传的请求。
 * 它利用OSS(Object Storage Service)上传工具将文件上传到云端。
 */
@RestController
public class Upload {
    /**
     * 自动注入OssUploadUtil实例,用于文件上传操作。
     */
    @Autowired
    private OssUploadUtil ossUploadUtil;

    /**
     * 处理文件上传的请求。
     * 
     * @param file 上传的文件对象。
     * @return 返回文件的URL地址。
     * @throws IOException 如果文件上传过程中发生错误。
     */
    @PostMapping("/upload")
    public Result upload(MultipartFile file) throws IOException {
        // 调用OSS上传工具,将文件上传到云端,并返回文件的URL地址。
        String url = ossUploadUtil.upload(file);
        // 构造上传成功的返回结果,包含文件的URL地址。
        return Result.success(url);
    }
}

 6.测试

测试时一定是POST请求,选择Body,form-data格式,将类型改为file类型,选择文件上传,点击发送,成功接收文件路径地址,此时返回阿里云,在自己创建的Bucket下面找到服务列表,也可以看到自己上传的文件。

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值