【工具类】使用阿里oss实现图片、视频、文档上传

2023-11-04

使用阿里oss实现图片、视频、文档上传

一、背景描述

功能是想实现图片、视频和文档的上传。

项目技术栈:springboot(2.1.5.RELEASE)

二、引入依赖

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

三、配置文件

oss:
  endpoint: http://oss-cn-hangzhou.aliyuncs.com
  accessKeyId: LTAI****Jb
  accessKeySecret: SEglg******iRW
  bucket: shcsoss

以上的配置内容,配置在application.yml文件中,放置在resources目录下。

四、接口实现

package com.iot.productmanual.controller;


import com.iot.framework.core.response.CommResponse;
import com.iot.productmanual.common.enums.ErrorCode;
import com.iot.productmanual.model.vo.Image;
import com.iot.productmanual.service.UploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;


/**
 * 这是一个类
 *
 * @author wzy
 * @date 2021/6/1  10:09
 */
@Api(value = "UploadController", tags = "文件上传oss通用")
@RequestMapping("/upload")
@Controller
public class UploadController {

    @Autowired
    private UploadService uploadService;

    @ApiOperation(value = "文件上传")
    @PostMapping("/file")
    @ResponseBody
    public CommResponse uploadFileSample(MultipartFile file) {
        String url = null;
        if (!file.isEmpty()) {
            CommResponse<Image> response = uploadService.uploadFile(file);
            if (response.getCode() != 0){
                return response;
            }
            Image image = response.getData();
            url = image.getSrc();
        }else {
            return CommResponse.fail(ErrorCode.E_420101.getCode(),ErrorCode.E_420101.getDesc());
        }
        return CommResponse.ok(url);
    }

}
package com.iot.productmanual.service.impl;

import com.aliyun.oss.OSSClient;
import com.iot.framework.core.response.CommResponse;
import com.iot.productmanual.common.enums.ErrorCode;
import com.iot.productmanual.model.vo.Image;
import com.iot.productmanual.service.UploadService;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 这是一个类
 *
 * @author wzy
 * @date 2021/11/18  15:53
 */
@Service("uploadService")
public class UploadServiceImpl implements UploadService {

    @Value("${oss.endpoint}")
    private String endpoint;
    @Value("${oss.accessKeyId}")
    private String accessKeyId;
    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${oss.bucket}")
    private String bucket;

    public static String[] imgs = {"jpg", "png", "gif", "jpeg"};
    public static String[] videos = {"mp4", "avi", "mp3", "wmv", "mpg", "mpeg", "mov", "rm", "swf", "flv", "ram"};
    public static String[] files = {"doc", "docx", "xls", "xlsx", "txt", "ppt", "pptx"};

    @Override
    public CommResponse<Image> uploadFile(MultipartFile file) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        OSSClient ossClient = null;
        URL url = null;
        String filename = null;
        try {
            String originalFilename = file.getOriginalFilename();
            //获取文件后缀
            String extension = FilenameUtils.getExtension(originalFilename);
            //更改文件名字
            String newName = UUID.randomUUID().toString().toUpperCase().replace("-", "");
            filename = newName + "." + extension;
            String objectName = null;
            if (ArrayUtils.contains(imgs, extension)) {
                objectName = "productManual" + "/img/" + simpleDateFormat.format(new Date()) + "/" + filename;
            } else if (ArrayUtils.contains(videos, extension)) {
                objectName = "productManual" + "/video/" + simpleDateFormat.format(new Date()) + "/" + filename;
            } else if (ArrayUtils.contains(files, extension)) {
                objectName = "productManual" + "/file/" + simpleDateFormat.format(new Date()) + "/" + filename;
            } else {
                return CommResponse.fail(ErrorCode.E_420102.getCode(), ErrorCode.E_420102.getDesc());
            }

            //创建连接
            ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

            ossClient.putObject(bucket, objectName, file.getInputStream());
            //设置URL存活时间
            final Long liveTime = 3600L * 1000 * 24 * 365 * 10;
            Date expiration = new Date(System.currentTimeMillis() + liveTime);
            url = ossClient.generatePresignedUrl(bucket, objectName, expiration);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        String toStringUrl = url.toString();
        Image image = new Image();
        image.setSrc(toStringUrl);
        image.setTitle(filename);
        return CommResponse.ok(image);
    }
}

package com.iot.productmanual.model.vo;

import lombok.Data;

import java.io.Serializable;

/**
 * <p>Image.java 此类用于 保存图片信息</p>
 * <p>@author:gyf </p>
 * <p>@date:2018/11/1 18:03</p>
 * <p>@remark: </p>
 */
@Data
public class Image implements Serializable {
    private String src;
    private String title;
}

完结!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【工具类】使用阿里oss实现图片、视频、文档上传 的相关文章

随机推荐

  • PWA及小程序在系统生态方面的支持对比

    PWA代表 渐进式网络应用 Progressive Web Application 它是一种结合了网页和移动应用程序功能的技术概念 PWA旨在提供类似于原生应用程序的用户体验 包括离线访问 推送通知 后台同步等功能 同时又具有网页的优势 如
  • JS new操作符具体做了什么?

    1 意义 在JavaScript中 new 操作符用于创建一个新的对象实例 具体来说 new 操作符会执行以下步骤 JavaScript中的new操作符是一个非常重要的操作符 它用于创建一个新的对象实例 2 实例化步骤 创建一个新的空对象
  • ctfweb入门(13-14)

    ctf show web13 进入题目是个文件上传的题目 尝试了一番文件上传漏洞利用的方法后 没有啥突破 可能有啥隐藏的目录 尝试源码泄露利用的方法 在输入upload php bak时成功下载下来源码 bak文件是备份文件 这里列举一下常
  • 华为机试HJ15 求int型正整数在内存中存储时1的个数

    HJ15 求int型正整数在内存中存储时1的个数 Python 题目 解题思路 代码 结果 代码优化 题目 解题思路 1 输入转整数 用Python的bin方法转为二进制 再按字符串逐个检查等于1 的个数 优化 代码 res 0 for c
  • Ubuntu各个版本下载和安装

    一 下载方式 推荐使用网易镜像站下载 官网下载速度太慢 在官网下载ubuntu 网址 https ubuntu com download desktop 在网易镜像站下载ubuntu 网址 http mirrors 163 com ubun
  • lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final

    今天在使用lambda表达式时 遇到一个问题 Variable used in lambda expression should be final or effectively final 代码如下 ClassName CyclicBarr
  • 关于Sensor和ISP,对输出图像做Crop和Downscale的注意事项

    01 背景 客户要求调试ov的一款分辨率为4608x2592的Sensor 但目前我司的Soc最大支持分辨率是4096x3456 所以目前能出的最大分辨率为4096x2592 11M 客户要求ISP要出两路视频流 11M 1080P 且不能
  • WPF Windows 设置无边框还能拖动,缩放

    1 窗体的介绍 标准窗口由两个重叠矩形组成 外部矩形是非工作区 通常称为chrome 它由操作系统的窗口管理器进行绘制和管理 窗口的非工作区是通过 WPF 实现的 其中包括大多数窗口所共有的窗口部分 包括以下各项 边框 标题栏 图标 最小化
  • Oracle PGA

    PGA ProgramGlobal Area 程序全局区 PGA是用户进程连接到数据库并创建一个对应的会话时 由ORACLE为服务器进程分配的专门用于当前用户会话的内存区 每个Oracle服务器进程都包含有属于自己的PGA 它只存储这个服务
  • 小程序中实现VR效果

    小程序中实现VR效果 最近的工作中有一个奇葩的需求 就是更根据房间场景图 打开摄像机或者上传图片来适配不同的背景图 类似于VR的效果 一开始百度搜索 发现小程序根本没有VR的插件 而小程序要实现VR需要使用web view 也就是使用网页的
  • Livox 设备时间同步

    Livox wiki时间同步教程 下面是PTP时间同步的方法 是相对容易的一种 笔记本因为有线网卡的问题大概率没法完成 最好选台式机 首先ifconfig确认一下网卡情况 通过下面的指令来检查网卡是否支持软件 硬件时间戳功能 本机有线网卡
  • ESP32-CAM监控摄像头

    在此项目中 我们将使用ESP32 CAM开发板构建IP监控摄像头 ESP32相机将托管一个视频流Web服务器 您可以使用网络中的任何设备对其进行访问 您可以将此视频流Web服务器与流行的家庭自动化平台 如Home Assistant或Nod
  • C++实现——卡特兰数列及其应用

    卡特兰数列的原理及其应用场景 令h 1 1 catalan数满足递归式 h n h 1 h n 1 h 2 h n 2 h n 1 h 1 其中n gt 2 该递推关系的解为 h n c 2n 2 n 1 n n 1 2 3 1 1 2 5
  • 什么是Java中的公平锁?

    一直想分析下公平锁和非公平锁在Java中的实现 公平锁 Fair 加锁前检查是否有排队等待的线程 优先排队等待的线程 先来先得非公平锁 Nonfair 加锁时不考虑排队等待问题 直接尝试获取锁 获取不到自动到队尾等待 首先Java中的Ree
  • springboot+mybatis自动生成插件+echars小练习

    概述 通过ajax异步从后台读取数据 用 eachars 在thymeleaf当中显示 建表用的是navicat12 支持正版 软件网盘地址 https pan baidu com s 1brJFVrdDdkP3XwkWND3 mA 1 建
  • unity webGL:collisionMeshData couldn’t be created because the mesh has been marked as non-accessible

    因为Unity从外部导入的fbx文件需要开启Read Write 功能 在webGL中才能进行MeshCollider的相关操作 如添加PointerEnter等 解决 在Inspector面板开启预置体的Read Write Enable
  • cmake 编译boost库遇到的坑

    错误 CMakeFiles main dir main cpp o In function boost asio detail posix event posix event usr local include boost asio det
  • ChatGPT将抢占谁的工作,未来如何应对

    AI人工智能领域里程碑式应用 ChatGPT影响力已经越来越大 激起大家强烈好奇心的同时 也让一些人发出了 感觉自己快要失业了 的焦虑 今天先说一下哪些人的工作会受到 ChatGPT等AI人工智能影响 从工业时代到数字时代这100多年的发展
  • LeetCode之最值问题系列问题求解

    最值系列题目求解 这类型题目的特点就是一个数组 或者字符串 给的条件是连续或者不连续 或者给定限定条件进行求解的情况 解题的关键 采用两个变量 一个变量记录前面的条件 或者最后一个不满足题意的index 或者最小值 比如股票题目当中j 或者
  • 【工具类】使用阿里oss实现图片、视频、文档上传

    使用阿里oss实现图片 视频 文档上传 一 背景描述 二 引入依赖 三 配置文件 四 接口实现 一 背景描述 功能是想实现图片 视频和文档的上传 项目技术栈 springboot 2 1 5 RELEASE 二 引入依赖