当前位置: 首页 > news >正文

案例-18.文件上传-阿里云OSS-集成

一.分析

要想将阿里云oss集成到新增员工的功能中,必须要设计文件上传的接口UploadController。首先前端给接口上传接口需要接收请求的图片,然后接口再将图片上传到阿里云oss中存储起来,接着接口从阿里云oss中获取图片的url并返回给前端,前端在将获取到的url文件渲染展示出来。

二.UploadController接口文档

响应数据是一个url路径,浏览器拿到该路径即可渲染展示出来该文件。

三.接口的开发

1.首先引入阿里云OSS文件上传的工具类

package com.gjw.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Data
@Component  // 使用Component实现控制反转(该工具类不属于controller,service,mapper/Dao)
public class AliOSSUtils {
    private String endpoint = "";    // 选择自己的
    private String accessKeyID = "";    // 选择自己的
    private String accessKeySecret = "";    // 选择自己的
    private String bucketName = "";    // 选择自己的
    

    @Autowired
    private AliOSSProperties aliOSSProperties;
    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {

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

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

 String originalFilename = file.getOriginalFilename();获取到文件的原始名字
 又构建了新的名字:String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));此处代码逻辑和上篇博客中的一模一样。

然后构建ossClient对象调用putObject方法进行文件上传。

文件上传完毕后下面组装文件的访问路径,就是将bucket拼接到endpoint,最后在拼接上文件的名字即可。

最后将url返回即可。

2.图片接口开发

/**
 * 图片上传接口:
 *      用于将图片上传到云服务器
 */
package com.gjw.controller;

import com.gjw.pojo.Result;
import com.gjw.util.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

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

@Slf4j
@RestController
public class UploadController {

    @Autowired  // 依赖注入
    private AliOSSUtils aliOSSUtils;
    /*@PostMapping("/upload")
//    public Result result(String username, Integer age, @RequestParam ("image")MultipartFile file) {
    public Result result(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传:{},{},{}",username,age,image);


        System.out.println(image.getName());    // 获取表单项的名字
        String originalFilename = image.getOriginalFilename();      // 获取原始文件名

        // 获取原始文件后缀
        int index = originalFilename.lastIndexOf(".");
        String substring = originalFilename.substring(index);


        // 通过Uuid获取到唯一文件名
        String uuid = UUID.randomUUID().toString();
        String newFileName = uuid + substring;
        // 将文件存储在服务器的磁盘目录中
        image.transferTo(new File("D:\\tlias-file\\image\\" + newFileName));

        return Result.success();
    }*/

    @PostMapping("/upload")
    public Result result(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}",image.getOriginalFilename());

        String url = aliOSSUtils.upload(image);
        log.info("上传文件的url为:{}",url);
        return Result.success(url);     // 将图片上传后的url返回,用于浏览器的展示
    }
}

总结

相关文章:

  • 0081.基于springboot+uni-app的垃圾分类小程序+论文
  • PAT乙级( 1018 锤子剪刀布)C语言超详细解析
  • CV -- YOLOv8 图像分割(GPU环境)
  • 【再谈设计模式】迭代器模式~遍历集合元素的利器
  • 数据链路层分析
  • PHP 安全与加密:守护 Web 应用的基石
  • 【C++】类与对象全面剖析(尾卷)(构造深化、类型转换、static成员特性及内部类与匿名对象)
  • Linksys WRT54G路由器溢出漏洞分析–运行环境修复
  • 业务流程中的基准测试 (Benchmarking in Business Processes)介绍
  • 树(数据结构·)
  • 【数据结构初阶第十二节】设计循环队列
  • 在WPF中实现窗口拖拽功能:打造自定义交互体验
  • 管道的学习
  • 当一个后端下载了一个VUE开源项目,怎么开始着手玩一下
  • 【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库
  • git 操作 已经 commit 但是没有 push 怎么办
  • 国产编辑器EverEdit - 独门暗器:自动监视剪贴板内容
  • 嵌入式0xDEADBEEF
  • 用python进行二分法查找(python实例三十)
  • 【算法通关村 Day5】Hash和队列的经典问题
  • 探秘多维魅力,长江经济带、珠三角媒体总编辑岳阳行启动
  • 1至4月全国铁路发送旅客14.6亿人次,创同期历史新高
  • 沧州低空经济起飞:飞行汽车开启千亿赛道,通用机场布局文旅体验
  • 美国和沙特签署上千亿美元军售协议
  • 俄副外长:俄美两国将举行双边谈判
  • 反犹、资金与抗议:特朗普的施压如何撕裂美国大学?|907编辑部