java调用阿里云对象存储,只需一个main方法

本文详细介绍了如何通过阿里云OSS API创建OSSClient并实现字符串和图片的上传,包括获取AccessKey和Endpoint,以及提供示例代码供读者实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要源码小伙伴可以到微信小程序:”MINIIT资源库“获取,作者承诺免费

一.首先获得阿里云对象存储API(我们只要进去获取三个字符串)

1.阿里云官网注册登录,进入首页鼠标移至产品处点击对象存储oss

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

2. 点击立即开通

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

3. 对象存储是按量付费的,可以购买套餐也可以不购买

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

 4.开通后就会进入工作台界面,点击bucket列表,然后创建bucket,创建时的表单都有默认选择

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

 5.然后上传文件,选择指定目录可以同时创建文件夹并将文件保存到该文件夹下,然后点击上传文件即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

 6.然后鼠标移至右上角头像,点击assessKey管理,会出现两串字符串,记得保存下来

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

点击左边概览,拿到你的endpoint(地域节点)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOGbGU=,size_20,color_FFFFFF,t_70,g_se,x_16

 准备工作结束。

二、实现代码我用一个main方法测试

package com.doll.aliyunoss.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.ByteArrayInputStream;
import java.io.File;

public class OssConfig {
    //    // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
//    String endpoint = "yourEndpoint";
//    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
//    String accessKeyId = "yourAccessKeyId";
//    String accessKeySecret = "yourAccessKeySecret";
//    // 填写Bucket名称,例如examplebucket。
//    String bucketName = "examplebucket";
//    // 填写文件名。文件名包含路径,不包含Bucket名称。例如exampledir/exampleobject.txt。
//    String objectName = "exampledir/exampleobject.txt";
//
//    // 创建OSSClient实例。
//    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//
//    String content = "Hello OSS";
//ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
//
//// 关闭OSSClient。
//ossClient.shutdown();
    public static void main(String[] args) {

        /**
         * 上传字符串
         */

//        String endpoint = "oss-cn-shenzhen.aliyuncs.com";
//        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
//        String accessKeyId = "LTAI5tMmZ5osb**********";
//        String accessKeySecret = "09TEui21PZgE8cc52***********";
//
//        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//
//        // 填写字符串。
//        String content = "Hello OSS";
//
//        // 创建PutObjectRequest对象。
//        // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
//        PutObjectRequest putObjectRequest = new PutObjectRequest("db-losen", "losen-test/test01.txt", new ByteArrayInputStream(content.getBytes()));
//
//        // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
//        //ObjectMetadata metadata = new ObjectMetadata();
//        //metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//        //metadata.setObjectAcl(CannedAccessControlList.Private);
//        //putObjectRequest.setMetadata(metadata);
//
//        // 上传文件。
//        ossClient.putObject(putObjectRequest);
//
//        // 关闭OSSClient。
//        ossClient.shutdown();
//}


/**
 * 上传图片
 */
//public class OssConfig {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = "oss-cn-shenzhen.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tMmZ5osb**********";
        String accessKeySecret = "09TEui21PZgE8cc52***********";
// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 创建PutObjectRequest对象。
// 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        PutObjectRequest putObjectRequest = new PutObjectRequest("db-losen", "losen-test/lyy2.jpg", new File("C:\\Users\\86199\\Pictures\\lyy2.jpg"));

// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);

// 上传文件。
        ossClient.putObject(putObjectRequest);

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

执行后回到阿里云看看有没有数据

<think>我们正在寻找芋道源码中关于文件上传的公共方法。根据之前的讨论,文件上传功能主要集中在后端Java代码的`infra/file`模块。公共方法通常位于服务层(Service)或工具类(Util)中,用于处理文件上传的核心逻辑。关键点:1.文件上传的公共方法可能存在于`FileService`接口及其实现类`FileServiceImpl`中,用于保存文件、生成唯一路径等。2.也可能存在一个文件上传工具类,例如`FileUploadUtils`,提供静态方法供各处调用。根据引用[^3]中提到的代码结构(虽然引用[^3]是Feign客户端示例,但芋道源码的结构类似),我们可以推测文件上传相关的服务类可能在`com.ruoyi.infra.module.file.service`包下。另外,引用[^1]提到自定义Realm,但这与文件上传无关,可以忽略。引用[^2]提到配置类,但主要是关于API分组的配置。引用[^4]提到minio依赖,说明芋道可能支持多种存储方式(本地、OSS、minio等),因此文件上传的公共方法可能会抽象出存储接口。因此,我们重点查找:1.`FileService`接口和`FileServiceImpl`实现类:通常会有`createFile`、`uploadFile`等方法。2.可能有一个文件存储策略接口(如`FileStorage`)和不同实现(`LocalFileStorage`、`OssFileStorage`、`MinioFileStorage`),公共方法可能在策略实现中。3.工具类:如`FileUploadUtils`,提供上传文件的静态工具方法。具体位置推测:-服务层接口:`com.ruoyi.infra.module.file.service.FileService`-服务层实现:`com.ruoyi.infra.module.file.service.impl.FileServiceImpl`-文件存储策略接口:`com.ruoyi.infra.framework.file.core.client.FileClient`-存储策略实现:在`com.ruoyi.infra.framework.file.core.client`包下的各个子类-工具类:可能位于`com.ruoyi.common.utils.file.FileUploadUtils`由于芋道源码版本可能不同,以上包路径仅供参考,但这是常见的结构。在芋道源码中,文件上传的公共方法可能被设计为支持多种存储方式(通过配置切换)。因此,核心上传逻辑可能委托给一个`FileClient`接口的实现类。在`FileServiceImpl`中,可能会注入`FileClient`,然后调用其上传方法。示例代码(简化):```java@ServicepublicclassFileServiceImplimplementsFileService{@AutowiredprivateFileClientfileClient;@OverridepublicFileUploadResultuploadFile(MultipartFilefile,StringfolderId){//生成唯一文件名等逻辑//调用fileClient上传StringfileUrl=fileClient.upload(file,folderId);//构建结果returnnewFileUploadResult(...);}}```而`FileClient`接口可能有如下方法:```javapublicinterfaceFileClient{Stringupload(MultipartFilefile,StringfolderId);//其他方法...}```所以,文件上传的公共方法实际上分布在:1.服务层(FileService)提供业务逻辑(如生成唯一路径、保存文件记录到数据库等)。2.文件存储客户端(FileClient)提供具体的存储上传实现。因此,要查找文件上传的公共方法,我们可以查看:-`FileServiceImpl`中的`uploadFile`方法(业务公共方法)-`FileClient`接口及其实现类(如`LocalFileClient`、`OssFileClient`)中的`upload`方法(存储上传公共方法)另外,如果存在工具类,可能在`common`模块中有文件操作工具类,但通常文件上传会通过服务层和存储客户端来组织,工具类可能只用于辅助(如获取文件名后缀等)。根据引用[^3]的包名结构,芋道源码的包名可能是`com.ruoyi`或`cn.iocoder`(不同版本可能不同),但整体结构类似。总结:芋道源码中文件上传的公共方法主要位于:1.`FileServiceImpl`类中的`uploadFile`方法(具体业务处理)2.`FileClient`接口的具体实现类(如`LocalFileClient`、`OssFileClient`)中的`upload`方法(核心上传操作)建议在项目中搜索这些类名,即可找到文件上传的公共方法。§§相关问题§§1.芋道源码中如何扩展新的文件存储方式(例如MinIO)?2.文件上传时如何实现断点续传?3.芋道源码中文件上传的公共方法是如何被前端调用的?</think>在芋道源码中,文件上传的公共方法主要集中在后端服务层,通过统一的文件存储客户端接口实现。以下是核心实现位置和关键方法: ### 一、文件上传公共方法位置 1. **文件存储客户端接口** - 路径:`yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/FileClient.java` - 核心方法: ```java String upload(byte[] content, String path) throws Exception; // 核心上传方法 String upload(InputStream content, String path); // 流式上传 void delete(String path); // 文件删除 ``` 该接口定义了统一的文件操作规范,支持多种存储实现[^3]。 2. **文件存储实现类** - **本地存储**: `LocalFileClient.java` 实现本地文件上传逻辑 ```java public class LocalFileClient implements FileClient { @Override public String upload(byte[] content, String path) { // 创建目录并写入文件 FileUtils.writeByteArrayToFile(new File(path), content); return config.getDomain() + "/" + path; // 返回访问URL } } ``` - **OSS存储**: `OssFileClient.java` 实现阿里云OSS上传逻辑 - **MinIO存储**: `MinioFileClient.java` 实现MinIO对象存储(需引入minio依赖[^4]) ### 二、服务层调用入口 - **文件服务实现类** 路径:`FileServiceImpl.java` 封装上传业务逻辑: ```java @Service public class FileServiceImpl implements FileService { @Resource private FileClient fileClient; // 注入存储客户端 public String uploadFile(byte[] content, String path) { // 1. 生成唯一文件名(UUID策略) String uniqueName = generateUniqueName(path); // 2. 调用统一上传接口 return fileClient.upload(content, uniqueName); } } ``` ### 三、控制器层调用 - **文件上传API** 路径:`FileController.java` 接收前端请求并调用服务层: ```java @PostMapping("/upload") public CommonResult<String> upload(@RequestParam("file") MultipartFile file) { // 调用FileServiceImpl.uploadFile() String url = fileService.uploadFile(file.getBytes(), file.getOriginalFilename()); return success(url); // 返回格式:{"code":200, "data":"https://xxx/file.jpg"} } ``` ### 四、关键设计特点 1. **多存储支持** 通过`FileClient`接口实现存储无感切换,只需配置`infra.file.type`(local/oss/minio)[^3] 2. **路径生成策略** 在`FileServiceImpl.generateUniqueName()`中实现: ```java private String generateUniqueName(String originalName) { return UUID.randomUUID() + getExtension(originalName); // UUID + 后缀 } ``` 3. **异常统一处理** 在`FileClient`实现类中捕获`IOException`并转换为自定义异常 > **提示**:具体实现细节可查看`cn.iocoder.yudao.module.infra`包下的文件相关模块,重点关注`framework/file`目录[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆le

一分两分也是爱,不求多哈哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值