热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

详解SpringBoot上传图片到阿里云的OSS对象存储中

这篇文章主要介绍了SpringBoot上传图片到阿里云的OSS对象存储中,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

启动idea创建一个SpringBoot项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将上面的步骤完成之后,点击下一步创建项目

在这里插入图片描述

创建完成之后修改pom.xml文件,添加阿里云oss依赖

在这里插入图片描述


	org.springframework.boot
  spring-boot-devtools
  runtime
  true

修改配置文件,将配置文件后缀名修改为yml类型的配置文件,并对阿里云oss进行参数的配置

在这里插入图片描述

server:
 port: 8088
# 阿里云存储参数配置
aliyun:
 oss:
  endpoint: 
  accessKeyId: 
  accessKeySecret: 
  bucketName: 

上面的参数我们首先进入阿里云官网,登录并进入自己的控制台

在这里插入图片描述

创建一个,方框中就是yml配置文件中的bucketName

在这里插入图片描述

点击进入就可以看见外网访问地址,将这个地址填写到yml配置文件中的endpoint

在这里插入图片描述

点击头像,选择AccessKey管理

在这里插入图片描述

选择继续使用AccessKey

在这里插入图片描述

创建一个AccessKey

在这里插入图片描述

创建成功,yml配置文件中的accessKeyId,accessKeySecret,对应填入相应位置

在这里插入图片描述

创建一个util(里面放oss工具类)文件夹,里面创建一个OssUtil的类。再创建一个Controller文件夹,里面创建一个OssController的文件

在这里插入图片描述

OssUtil类

package com.example.ossdemo.util;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;

/**
 * 阿里云OSS服务器工具类
 */
@Component
public class OssUtil {

  //---------变量----------
  protected static final Logger log = LoggerFactory.getLogger(OssUtil.class);

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

  //文件存储目录
  private String filedir = "my_file/";

  /**
   * 1、单个文件上传
   * @param file
   * @return 返回完整URL地址
   */
  public String uploadFile(MultipartFile file) {
    String fileUrl = uploadImg2Oss(file);
    String str = getFileUrl(fileUrl);
    return str.trim();
  }

  /**
   * 1、单个文件上传(指定文件名(带后缀))
   * @param file
   * @return 返回完整URL地址
   */
  public String uploadFile(MultipartFile file,String fileName) {
    try {
      InputStream inputStream = file.getInputStream();
      this.uploadFile2OSS(inputStream, fileName);
      return fileName;
    }
    catch (Exception e) {
      return "上传失败";
    }
  }

  /**
   * 2、多文件上传
   * @param fileList
   * @return 返回完整URL,逗号分隔
   */
  public String uploadFile(List fileList) {
    String fileUrl = "";
    String str = "";
    String photoUrl = "";
    for(int i = 0;i0) {
      String[] split = fileUrl.split("/");
      String url = this.getUrl(this.filedir + split[split.length - 1]);
      return url;
    }
    return null;
  }

  //获取去掉参数的完整路径
  private String getShortUrl(String url) {
    String[] imgUrls = url.split("\\?");
    return imgUrls[0].trim();
  }

  // 获得url链接
  private String getUrl(String key) {
    // 设置URL过期时间为20年 3600l* 1000*24*365*20
    Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 20);
    // 生成URL
    OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
    if (url != null) {
      return getShortUrl(url.toString());
    }
    return null;
  }

  // 上传文件
  private String uploadImg2Oss(MultipartFile file) {
    //1、限制最大文件为20M
    if (file.getSize() > 1024 * 1024 *20) {
      return "图片太大";
    }

    String fileName = file.getOriginalFilename();
    String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); //文件后缀
    String uuid = UUID.randomUUID().toString();
    String name = uuid + suffix;

    try {
      InputStream inputStream = file.getInputStream();
      this.uploadFile2OSS(inputStream, name);
      return name;
    }
    catch (Exception e) {
      return "上传失败";
    }
  }


  // 上传文件(指定文件名)
  private String uploadFile2OSS(InputStream instream, String fileName) {
    String ret = "";
    try {
      //创建上传Object的Metadata
      ObjectMetadata objectMetadata = new ObjectMetadata();
      objectMetadata.setContentLength(instream.available());
      objectMetadata.setCacheControl("no-cache");
      objectMetadata.setHeader("Pragma", "no-cache");
      objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
      objectMetadata.setContentDisposition("inline;filename=" + fileName);
      //上传文件

      OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
      PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);
      ret = putResult.getETag();
    } catch (IOException e) {
      log.error(e.getMessage(), e);
    } finally {
      try {
        if (instream != null) {
          instream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return ret;
  }

  private static String getcontentType(String FilenameExtension) {
    if (FilenameExtension.equalsIgnoreCase(".bmp")) {
      return "image/bmp";
    }
    if (FilenameExtension.equalsIgnoreCase(".gif")) {
      return "image/gif";
    }
    if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
        FilenameExtension.equalsIgnoreCase(".jpg") ||
        FilenameExtension.equalsIgnoreCase(".png")) {
      return "image/jpeg";
    }
    if (FilenameExtension.equalsIgnoreCase(".html")) {
      return "text/html";
    }
    if (FilenameExtension.equalsIgnoreCase(".txt")) {
      return "text/plain";
    }
    if (FilenameExtension.equalsIgnoreCase(".vsd")) {
      return "application/vnd.visio";
    }
    if (FilenameExtension.equalsIgnoreCase(".pptx") ||
        FilenameExtension.equalsIgnoreCase(".ppt")) {
      return "application/vnd.ms-powerpoint";
    }
    if (FilenameExtension.equalsIgnoreCase(".docx") ||
        FilenameExtension.equalsIgnoreCase(".doc")) {
      return "application/msword";
    }
    if (FilenameExtension.equalsIgnoreCase(".xml")) {
      return "text/xml";
    }
    //PDF
    if (FilenameExtension.equalsIgnoreCase(".pdf")) {
      return "application/pdf";
    }
    return "image/jpeg";
  }
}

OssController类

package com.example.ossdemo.controller;

import com.example.ossdemo.util.OssUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/oss")
public class OssController {

  @Autowired
  OssUtil ossUtil; //注入OssUtil

  @PostMapping("/uploadfile")
  public Object fileUpload(@RequestParam("file") MultipartFile file)
  {
    try {
      String url = ossUtil.uploadFile(file); //调用OSS工具类
      Map returnbody = new HashMap<>();
      Map returnMap = new HashMap<>();
      returnMap.put("url", url);
      returnbody.put("data",returnMap);
      returnbody.put("code","200");
      returnbody.put("message","上传成功");
      return returnbody;
    }
    catch (Exception e) {
      Map returnbody = new HashMap<>();
      returnbody.put("data",null);
      returnbody.put("code","400");
      returnbody.put("message","上传失败");
      return returnbody;
    }
  }
}

使用postman进行请求

在这里插入图片描述

这样就可以将文件上传到阿里云OSS啦

在这里插入图片描述

另外如果对这个项目不懂的,可以再底部留言哦,看见回复。要源码的小伙伴我将源码放在码云,自取哦!

项目码云地址

总结

到此这篇关于详解SpringBoot上传图片到阿里云的OSS对象存储中的文章就介绍到这了,更多相关SpringBoot上传阿里云的OSS内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
author-avatar
王-闻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有