阿里 OSS 文件上传,别再说你不会上传文件了。

  • J3 - 白起
  • OSS(文件上传 # 教程)

最近关注我的都知道,我开了一个 communication地址) 项目,本意是将它开发成一个多功能系统中台,所以为其量身打造了很多个功能,可以说都快成一个大杂烩了被我搞得。

但我发现这个项目连基本的文件上传都没有,这不行,要搞一个。

在进行文件上传功能前,我分析了一下腾讯及阿里的文件存储服务功能,流程都基本类似都是申请XXX云账号,开通文件存储对象功能,对接sdk,开始编码等。

那为啥用第三方,不直接将文件上传到自己的服务器中呢!一是我前面接触过阿里OSS文件存储服务功能,觉得很方便存取不用花他多时间管理文件服务、二是本地文件上传对于分布式系统要求很高嘛,所以图简单就直接用第三方了。不过后面我会再出一期上传到本地服务其的文件上传教程(下期)。

好了,铺垫很多了,现在就开始用 SpringBoot + OSS 搭建一个通用的文件上传功能。

所有代码均在Gitee:https://gitee.com/j3_baiqi/communication

一、开通阿里云OSS服务功能

地址:https://www.aliyun.com/

访问地址,登录自己的阿里云(一定要实名认证

按照如下截图进行操作:

一:选择 OSS 文件服务产品

在这里插入图片描述

二:进入 OSS 控制台

在这里插入图片描述

三:点击 Bucket 列表创建一个 bucket

在这里插入图片描述

四:配置 Bucket

在这里插入图片描述

  • Bucket 名称:和项目相关的名称就行了
  • 存储类型:标准存储
  • 版本控制:不开通
  • 读写权限:公共读就行
  • 服务端加密方式:无
  • 试试日志查询:不开通

点击确认,一个 bucket 就创建好了,如下:

在这里插入图片描述

下面就要创建一个代码可以访问 OSS 服务的 AccessKey

一:进入 AccessKey 管理

在这里插入图片描述

二:选择子 AccessKey

在这里插入图片描述

三:创建 AccessKey 用户

在这里插入图片描述

四:配置 AccessKey 用户

在这里插入图片描述

五:AccessKey 用户列表

在这里插入图片描述

注意!注意!注意!创建好之后出现的 用户 AccessKey 列表中的 AccessKey IDAccessKey Secret 这两个值非常重要,而且只会显示一次,如果不拿小本本记录下来,忘了就只能删除重现创建。

下面就要给这个用户 key 赋权限(只给管理 OSS 服务的权限就行)

六:添加权限

在这里插入图片描述

到此,代码开发前的准备工作就完成了,此时你应该知道如下信息:

  • bucket:j3-communication
  • Bucket 域名(外网访问):https://oss-cn-guangzhou.aliyuncs.com
  • accessKeyId:你自己的
  • accessKeySecret:你自己的

二、代码实现

2.1 添加依赖

创建一个 SpringBoot 项目,添加如下依赖。

地址:https://help.aliyun.com/document_detail/32009.html

<!--OSS文件服务-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

再配置一下文件上传大小限制

再 application.yml 中添加如下配置,限制单个文件最大 100M 、文件上传总大小 200M。

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 200MB

2.2 文件上传编码

实现功能有:

  1. 单个文件上传
  2. 多个文件上传
  3. 单个文件删除
  4. 多个文件删除
@Slf4j
@Component
@AllArgsConstructor
public class OssTemplate {

    // 我自己抽的统一文件前缀,communication-resource
    private final String prefix = "oss.file.prefix";
    // 你的 bucket,j3-communication
    private final String bucket = "oss.file.bucket";
    // 你的 bucket 外网访问域名,https://oss-cn-guangzhou.aliyuncs.com
    private final String endpoint = "oss.file.endpoint";
    // 拼接返回url要用的,bucket + 域名 例如: j3-communication.oss-cn-guangzhou.aliyuncs.com
    private final String bucketHost = "oss.file.bucketHost";
    // 这两个就没啥好说的了
    private final String accessKeyId = "oss.file.accessKeyId";
    private final String accessKeySecret = "oss.file.accessKeySecret";
    // 生成文件路径用的,根据日期
    private final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

    /**
     * 单个文件上传
     * @param file
     * @return
     */
    public String upload(MultipartFile file) {
        // 路径拼接
        String dataPath = format.format(new Date());
        // 文件名称生成
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String path = prefix + "/" + dataPath + "/" + uuid + file.getOriginalFilename();
        try {
            // 上传
            ossUpload(bucket, path, file.getInputStream());
        } catch (IOException e) {
            throw new SysException("文件上传失败!");
        }
        // 因为 oss 不会返回访问 url 所以我们自己可以拼接一个:
        // 协议(https://) + 域名访问地址(j3-communication.oss-cn-guangzhou.aliyuncs.com) + 自己拼接的路径(xxx/xxx/a.jpg)
        return "https://" + bucketHost + "/" + path;
    }


    /**
     * 多个文件上传
     * @param files
     * @return
     */
    public List<String> upload(MultipartFile[] files) {
        List<String> usrList = new ArrayList<>(files.length);
        for (MultipartFile file : files) {
            usrList.add(upload(file));
        }
        return usrList;
    }


    /**
     * 具体上传代码
     * @param bucket backet名称
     * @param path 路径
     * @param inputStream 文件流
     * @return
     */
    private PutObjectResult ossUpload(String bucket, String path, InputStream inputStream) {
        OSS ossClient = null;
        PutObjectResult putObjectResult = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint
                    , accessKeyId
                    , accessKeySecret);
            // 通过文件流的形式上传文件
            putObjectResult = ossClient.putObject(bucket, path, inputStream);
        } catch (Exception e) {
            //错误处理
            log.error("==========ossUpload_error, {}", e);
            throw new SysException("文件上传失败!");
        } finally {
            //资源关闭
            assert ossClient != null;
            ossClient.shutdown();
        }
        return putObjectResult;
    }


    /**
     * 单个删除
     * @param url 文件url
     */
    public void delete(String url) {
        // 处理 url
        log.info("============入参:{}", url);
        String path = url.substring(("https://" + bucketHost + "/").length());
        log.info("============path:{}", path);
        ossDelete(bucket, Collections.singletonList(path));
    }

    /**
     * 多个删除
     * @param urlList
     */
    public void delete(List<String> urlList) {
        List<String> keys = new ArrayList<>(urlList.size());
        for (String url : urlList) {
            keys.add(url.substring(("https://" + bucketHost + "/").length()));
        }
        ossDelete(bucket, keys);
    }

    /**
     * 具体删除代码
     * @param bucket backet
     * @param pathList 文件url列表
     */
    private void ossDelete(String bucket, List<String> pathList) {
        OSS ossClient = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint
                    , accessKeyId
                    , accessKeySecret);
            // ossClient.deleteObject(bucket, path);
            DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucket);
            deleteObjectsRequest.setKeys(pathList);
            ossClient.deleteObjects(deleteObjectsRequest);
        } catch (Exception e) {
            //错误处理
            log.error("==========ossUpload_error, {}", e);
            throw new SysException("文件删除失败!");
        } finally {
            //资源关闭
            assert ossClient != null;
            ossClient.shutdown();
        }
    }

}

2.3 编写 controller 测试

@Slf4j
@AllArgsConstructor
@ResponseResult
@RequestMapping("/test/oss")
public class OssTemplateTest {

    private final OssTemplate ossTemplate;

    @PostMapping("/upload")
    public String upload(MultipartFile file) {
        return ossTemplate.upload(file);
    }

    @PostMapping("/batch")
    public List<String> upload(MultipartFile[] files) {
        return ossTemplate.upload(files);
    }

    @GetMapping("/delete")
    public void delete(@RequestParam(name = "url") String url) {
        ossTemplate.delete(url);
    }

    @PostMapping("/deletes")
    public void deletes(@RequestBody List<String> urlList) {
        ossTemplate.delete(urlList);
    }

}

2.4 验证

可以访问自己的 oss 文件后台验证文件是否存在

在这里插入图片描述

这样,一个简单的文件上传就写好了,还是非常简单的,主要功能还是 OssTemplate 类。

下篇写直接上传文件到服务器,然后通过 Nginx 代理访问服务器中的资源文件。

好了,今天的内容到这里就结束了,关注我,我们下期见

查阅或参考资料:

  1. 阿里 OSS 文件服务文档

联系方式:

QQ:1491989462,做个好友,来个点赞之交。


  • 由于博主才疏学浅,难免会有纰漏,假如你发现了错误或偏见的地方,还望留言给我指出来,我会对其加以修正。

  • 如果你觉得文章还不错,你的转发、分享、点赞、留言就是对我最大的鼓励。

  • 感谢您的阅读,十分欢迎并感谢您的关注。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

CSDN:J3 - 白起

掘金:J3-白起

知乎:J3-白起

这是一个技术一般,但热衷于分享;经验尚浅,但脸皮够厚;明明年轻有颜值,但非要靠才华吃饭的程序员。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
你可以使用阿里云官方提供的 OSS(对象存储服务)SDK 来实现 Android 上的文件上传功能。以下是一个简单的示例代码,需要先引入阿里OSS SDK 的依赖: ```java implementation 'com.aliyun.dpa:oss-android-sdk:3.1.8' ``` 然后,在你的代码中使用以下方法来实现文件上传: ```java import com.aliyun.dpa.oss.app.AppServiceFactory; import com.aliyun.dpa.oss.app.OSSClientFactory; import com.aliyun.dpa.oss.app.RunningConfig; import com.aliyun.dpa.oss.app.ServiceFactory; import com.aliyun.dpa.oss.app.UploadConfiguration; import com.aliyun.dpa.oss.app.UploadConfigurationFactory; import com.aliyun.dpa.oss.app.UploadManager; import com.aliyun.dpa.oss.app.util.FileUtil; import com.aliyun.dpa.oss.app.util.StringUtil; import com.aliyun.dpa.oss.app.util.UIUtil; import com.aliyun.dpa.oss.callback.ResultCallback; import com.aliyun.dpa.oss.model.OSSUploadConfiguration; import com.aliyun.dpa.oss.task.PutObjectTask; import com.aliyun.dpa.oss.task.TaskCancelledException; public class AliOSSUploader { private static final String ENDPOINT = "your_oss_endpoint"; // 你的 OSS Endpoint private static final String ACCESS_KEY_ID = "your_access_key_id"; // 你的 Access Key ID private static final String ACCESS_KEY_SECRET = "your_access_key_secret"; // 你的 Access Key Secret private static final String BUCKET_NAME = "your_bucket_name"; // 你的 Bucket 名称 public void uploadFile(String filePath) { // 创建 OSS 客户端 RunningConfig runningConfig = new RunningConfig(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ENDPOINT); AppServiceFactory.init(runningConfig); ServiceFactory serviceFactory = OSSClientFactory.createServiceFactory(); UploadConfiguration configuration = UploadConfigurationFactory.getUploadConfiguration(); UploadManager uploadManager = serviceFactory.createUploadManager(configuration); // 构造上传任务 PutObjectTask putObjectTask = new PutObjectTask(BUCKET_NAME, StringUtil.generateRandomKey(), filePath); // 设置上传结果回调 putObjectTask.setResultCallback(new ResultCallback() { @Override public void onSuccess(Object object) { // 文件上传成功 UIUtil.showToast("文件上传成功"); } @Override public void onFailure(Exception e) { // 文件上传失败 UIUtil.showToast("文件上传失败:" + e.getMessage()); } @Override public void onProgress(Object object, long currentSize, long totalSize) { // 文件上传进度 int progress = (int) (currentSize * 100 / totalSize); UIUtil.showToast("文件上传进度:" + progress + "%"); } @Override public void onCancel(Object object) { // 文件上传取消 UIUtil.showToast("文件上传取消"); } }); // 开始上传任务 try { uploadManager.upload(putObjectTask); } catch (TaskCancelledException e) { // 上传任务取消 UIUtil.showToast("文件上传取消"); } } } ``` 以上代码中的 `your_oss_endpoint`、`your_access_key_id`、`your_access_key_secret` 和 `your_bucket_name` 分别是你的 OSS Endpoint、Access Key ID、Access Key Secret 和 Bucket 名称。你需要将它们替换为你自己的实际值。 调用 `uploadFile` 方法并传入要上传的文件路径,即可实现文件上传阿里OSS。记得在 AndroidManifest.xml 中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 希望对你有帮助!如有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

J3code

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值