Ruoyi框架上传文件、图片到阿里云Oss教程

大体思路:

1、首先你得有个OSS

2、使用阿里云Oss Java SDK,调整ruoyi框架代码

1、前提引入:

Ruoyi默认上传文件的地址为本地服务器,而我想把文件传到云存储上,起初想着直接用ECS服务器,结果找了半天发现并不好使,于是听劝,正好有试用,弄了个OSS……

2、Ruoyi框架上传文件到OSS--解析:

(1)在admin模块,定位到Ruoyi上传文件的接口文件:

CommonController,如下:

com.ruoyi.web.controller.common.CommonController

找到uploadFile()方法,发现其是依据你当前的代码运行环境,进行的文件上传。

(比如前缀:http://localhost/dev-api,再加文件名字)

我们需要更改对前缀的获取方法,引用OSS java sdk

(2)common模块,引入OSS、lombok依赖

        在common模块(就是ruoyi-common文件夹)找到pom.xml文件:引入依赖

<!--oss依赖-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.11.2</version>
</dependency>

<!--lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>

(防止报错,推荐也在admin模块的pom文件,引入依赖)

(3)调用Oss服务

在common模块下,找到file文件(路径:com.ruoyi.common.utils.file),新建OssUtil类。

package com.ruoyi.common.utils.file;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;
/**
 * Oss服务调用
 */
@Log4j2
public class OssUtil {
    /**
     * Endpoint 存储对象概述  阿里云RAM账号AccessKey,accessKeySecret拥有所有API的访问权限  访问路径前缀  存储对象概述
     */
    private static String endPoint = "oss-cn-beijing.aliyuncs.com";
    //这里是你的oss节点,对应的外网Endpoint地址,我的是华北2(北京),对应上文
    //官网可查:https://help.aliyun.com/zh/oss/user-guide/regions-and-endpoints

    private static String accessKeyId = "这是你的RAM用户的id";
    private static String accessKeySecret = "这是你的RAM用户的Secret";
    //这里推荐,创建RAM用户,创建对应的AccessKey,然后直接复制过来就行

    private static String accessPre = "https://xxxxxxx.oss-cn-beijing.aliyuncs.com/";
    //这个就是你的oss访问前缀,一般就是:https://+ bucket名称.+ endPoint地址;

    /**
     * bucket名称
     * @return
     */
    private static String bucketName = "xxxxxxx";
    //这是你的OSS存储,创建的bucket的名称

    private static OSS ossClient ;

    static {
        ossClient = new OSSClientBuilder().build(
                endPoint,
                accessKeyId,
                accessKeySecret);
        log.info("oss服务连接成功!");
    }

    /**
     * 默认路径上传本地文件
     * @param filePath
     */
    public static String uploadFile(String filePath){
        return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath);
    }

    /**
     * 默认路径上传multipartFile文件
     * @param multipartFile
     */
    public static String uploadMultipartFile(MultipartFile multipartFile) {
        return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile);
    }
    /**
     * 上传 multipartFile 类型文件
     * @param bucketName
     * @param ossPath
     * @param multipartFile
     */
    public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){
        InputStream inputStream = null;
        try {
            inputStream = multipartFile.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        return accessPre+ossPath;
        //这是返回的图片路径,我们要用这个
//        return ossPath;
    }

    /**
     * 使用File上传PutObject上传文件 ** 程序默认使用次方法上传
     * @param bucketName 实例名称
     * @param ossPath oss存储路径
     * @param filePath 本地文件路径
     */
    public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) {
        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));

        // 上传
        ossClient.putObject(putObjectRequest);
        return accessPre+ossPath;
//        return ossPath;
    }

    /**
     * 使用文件流上传到指定的bucket实例
     * @param bucketName 实例名称
     * @param ossPath oss存储路径
     * @param filePath 本地文件路径
     */
    public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){

        // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
        uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        return accessPre+ossPath;
//        return ossPath;
    }

    public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){
        ossClient.putObject(bucketName, ossPath, inputStream);
    }

    /**
     * 下载
     * @param ossFilePath
     * @param filePath
     */
    public static void downloadFile(String ossFilePath , String filePath ){
        downloadFileForBucket(bucketName , ossFilePath , filePath);
    }
    /**
     * 下载
     * @param bucketName 实例名称
     * @param ossFilePath oss存储路径
     * @param filePath 本地文件路径
     */
    public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){
        ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
    }

    /**
     *
     * @return
     */
    public static String getOssDefaultPath(){
        LocalDateTime now = LocalDateTime.now();
        String url =
                now.getYear()+"/"+
                        now.getMonth()+"/"+
                        now.getDayOfMonth()+"/"+
                        now.getHour()+"/"+
                        now.getMinute()+"/";
        return url;
    }

    public static String getOssFilePath(String filePath){
        String fileSuf = filePath.substring(filePath.indexOf(".") + 1);
        return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf;
    }

}
注意去官网(OSS访问域名和数据中心_对象存储(OSS)-阿里云帮助中心)看下自己的endPoint;我的为华北2(北京),如下:

(4)调整CommonController:

更改uploadFile方法中文件路径的获取方式:如下(可直接复制)
 /**
     * 通用上传请求(单个)
     */
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception
    {
        try
        {
            // 上传文件路径
//          String filePath = RuoYiConfig.getUploadPath();
            //新添加的用法
            String fileName = OssUtil.uploadMultipartFile(file);
            System.out.println(fileName);

            // 上传并返回新文件名称
//          String fileName = FileUploadUtils.upload(filePath, file);
//          String url = serverConfig.getUrl() + fileName;

            String url = fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", FileUtils.getName(fileName));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

到这一步,一般就完成了,接下来可以验证一下

3、验证

重启后端,进行图片上传操作(文件也类似,调用的接口一致,就用图片来验证了):

OSS内验证:

成功存储~

前端使用,可看:Ruoyi-app/uniapp上传文件到服务器-CSDN博客

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值