SpringBoot集成阿里云OSS图片上传

简述

最近做的公司项目,图片比较多,不想给其存储到自己服务器上,就买了阿里云的OSS服务器来哦进行存储,其实集成第三方平台,一般没什么难度,当然,你要仔细看对方的API文档,这篇主要说一下个人集成OSS的过程

步骤

1、pom.xml中添加OSS的SDK

<!-- 图片上传 SDK 阿里云oss -->
<dependency>
 <groupId>com.aliyun.oss</groupId>
 <artifactId>aliyun-sdk-oss</artifactId>
 <version>2.8.3</version>
</dependency>

2、必备参数

在application.yml中配置参数

bucketName: "空间名称"
accessKeyId: "你的accessKeyId"
accessKeySecret: "你的accessKeySecret"
#OSS对应的区域
endpoint: http://oss-cn-beijing.aliyuncs.com

这四个参数在你的阿里云控制台中都能找到

①bucketName

②③accessKeyId和accessKeySecret

配置文件格式如图:

3、创建OSS工具类

/**
 * OssUtil.java
 * com.prereadweb.utils
 * Copyright (c) 2019, 北京链天下科技有限公司版权所有.
 */
package com.prereadweb.utils;

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.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * @Description: 阿里云OSS服务器工具类
 * @author: Yangxf
 * @date: 2019/4/18 16:26
 */
@Component
public class OssUtil {

  protected static final Logger log = LoggerFactory.getLogger(OssUtil.class);

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

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

  /**
   *
   * 上传图片
   * @param file
   * @return
   */
  public String uploadImg2Oss(MultipartFile file) {
    if (file.getSize() > 1024 * 1024 *20) {
      return "图片太大";//RestResultGenerator.createErrorResult(ResponseEnum.PHOTO_TOO_MAX);
    }
    String originalFilename = file.getOriginalFilename();
    String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
    Random random = new Random();
    String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
    try {
      InputStream inputStream = file.getInputStream();
      this.uploadFile2OSS(inputStream, name);
      return name;//RestResultGenerator.createSuccessResult(name);
    } catch (Exception e) {
      return "上传失败";//RestResultGenerator.createErrorResult(ResponseEnum.PHOTO_UPLOAD);
    }
  }

  /**
   * 上传图片获取fileUrl
   * @param instream
   * @param fileName
   * @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;
  }

  public 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";
    }
    return "image/jpeg";
  }

  /**
   * 获取图片路径
   * @param fileUrl
   * @return
   */
  public String getImgUrl(String fileUrl) {
    if (!StringUtils.isEmpty(fileUrl)) {
      String[] split = fileUrl.split("/");
      String url = this.getUrl(this.filedir + split[split.length - 1]);
      return url;
    }
    return null;
  }

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

  /**
   * 多图片上传
   * @param fileList
   * @return
   */
  public String checkList(List<MultipartFile> fileList) {
    String fileUrl = "";
    String str = "";
    String photoUrl = "";
    for(int i = 0;i< fileList.size();i++){
      fileUrl = uploadImg2Oss(fileList.get(i));
      str = getImgUrl(fileUrl);
      if(i == 0){
        photoUrl = str;
      }else {
        photoUrl += "," + str;
      }
    }
    return photoUrl.trim();
  }

  /**
   * 单个图片上传
   * @param file
   * @return
   */
  public String checkImage(MultipartFile file){
    String fileUrl = uploadImg2Oss(file);
    String str = getImgUrl(fileUrl);
    return str.trim();
  }
}

 4、controller层代码

/**
   * @Function: 用户图片上传
   * @author:  Yangxf
   * @Date:   2019/4/17 15:42
   */
  @PostMapping("/postfile")
  public Object fileUpload(@RequestParam(value = "userImg", required = false) MultipartFile file, @RequestParam(value = "userId", required = false) Long userId) {
    return personalService.fileUpload(file, userId);
  }

 5、service层代码

/**
   * @Function: 用户头像上传
   * @author:  YangXueFeng
   * @Date:   2019/4/18 16:15
   * @param:
   * @return:
   */
  @Override
  public Map<String, Object> fileUpload(MultipartFile file, Long userId) {
    Map<String, Object> map = new HashMap<>();
    if (Util.isEmpty(file)) {
      System.out.println("文件为空空");
      return checkNull(map);
    }
    UserEntity user = userMapper.fetchUser(userId);
    if(Util.isEmpty(user)){
      map.put("code", UserStatusEnum.USER_NOT_EXISTENCE.intKey());
      map.put("msg", UserStatusEnum.USER_NOT_EXISTENCE.value());
      return map;
    }
    String url = ossUtil.checkImage(file);
    String[] imgUrls = url.split("\\?");
    updateUrl(userId, imgUrls[0]);
    Map<String, Object> returnMap = new HashMap<>();
    returnMap.put("imageUrl", imgUrls[0]);
    map.put("data", returnMap);
    returnSuccess(map);
    return map;
  }

总结

对于第三对接来说,一般对方的API文档都会详细说明使用步骤的,所以,只要仔细看对方提供的API文档了,都没什么难的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot图片上传和访问路径映射

    简介 做移动端对接,框架用的SpringBoot,接口RESTful,实现一个图片上传功能,图片上传是个经典的应用场景了,完成后,做个笔记记录一下,希望能帮到攻城狮们 开发步骤 1.先贴图片上传工具类 package com.prereadweb.utils; import java.io.File; import java.io.FileOutputStream; import java.util.UUID; /** * @Description: 文件工具类 * @author: Yangx

  • 基于SpringBoot实现图片上传与显示

    本文为大家分享了SpringBoot实现图片上传与显示的具体代码,供大家参考,具体内容如下 SpringBoot实现图片上传与显示:Demo地址 效果图预览 思路 一般情况下都是将用户上传的图片放到服务器的某个文件夹中,然后将图片在服务器中的路径存入数据库.本Demo也是这样做的. 由于用户自己保存的图片文件名可能跟其他用户同名造成冲突,因此本Demo选择了使用UUID来生成随机的文件名解决冲突. 但是本Demo不涉及任何有关数据库的操作,便于演示,就用原来的文件名. 步骤 pom相关依赖 基于

  • SpringBoot限制文件或图片上传大小的两种配置方法

    今天做图片上传时候,报了如下错:服务运行异常,Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted

  • SpringBoot集成阿里云OSS图片上传

    简述 最近做的公司项目,图片比较多,不想给其存储到自己服务器上,就买了阿里云的OSS服务器来哦进行存储,其实集成第三方平台,一般没什么难度,当然,你要仔细看对方的API文档,这篇主要说一下个人集成OSS的过程 步骤 1.pom.xml中添加OSS的SDK <!-- 图片上传 SDK 阿里云oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-os

  • php版阿里云OSS图片上传类详解

    本文实例讲述了php版阿里云OSS图片上传类.分享给大家供大家参考,具体如下: 1.阿里云基本函数 /** * 把本地变量的内容到文件 * 简单上传,上传指定变量的内存值作为object的内容 */ public function putObject($imgPath,$object) { $content = file_get_contents($imgPath); // 把当前文件的内容获取到传入文件中 $options = array(); try { $this->ossClient->

  • Thinkphp整合阿里云OSS图片上传实例代码

    Thinkphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了 首先引入阿里云OSS类库 <?php namespace Home\Controller; use Think\Controller; use OSS\Core\OssException; vendor('aliyun.autoload'); 上传图片自己写,上传成功到阿里云后,删除临时文件 function aliyun() {

  • Springboot集成阿里云OSS上传文件系统教程

    第一步:开通阿里云OSS服务,创建Bucket,获取id和密钥 第二步:根据官方文档编写上传代码 1.新建maven项目 添加依赖: <!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency> <!-- 日期工具栏依赖 --> <

  • Android 阿里云OSS文件上传的实现示例

    估计有小伙伴看到阿里云oss的api文档十脸懵逼了,啊哈哈哈,接下来博主就来拯救你了,看完觉得好的就关注博主吧,么么么么么哒!!! 想要自己研究阿里云oss的,博主开启传送门给你:阿里云oss 一.项目导入阿里云oss的SDK 方式1:在build文件添加依赖(博主和官方一致推荐) dependencies { //阿里云oss implementation 'com.aliyun.dpa:oss-android-sdk:+' } 方式2:源码编译jar包 源码传送门:官方阿里云oss源码 二.

  • springboot操作阿里云OSS实现文件上传,下载,删除功能

    参考资料:Java操作阿里云OSS操作官方文档 学会看文档,并实际运用也是一种习惯和技能 下面就来简单入门一下,用当下比较热门的Springboot 去操作阿里云OSS文件存储. 1.需求 (没踩过下面的坑的小伙伴可以直接跳过这一章节) 问题简述 首先,我在之前自己做一些开源小项目案例中遇到一些文件上传下载的问题,比如在本机文件上传和下载都可以正常使用,通过将文件上传到Springboot项目的根目录下,按日期分文件夹,文件访问也很方便,可以直接返回文件相对路径地址,并直接可以访问. 问题 然而

  • laravel 实现阿里云oss文件上传功能的示例

    1.定义路由 // 阿里云文件储存 Route::group(['prefix'=>'aliyun'], function(){ Route::get('sign', 'AliyunController@sign'); }); 2.编写 controller 层 /** * 返回OSS的签名验证 * @return JSON 签名信息 */ public function sign(Request $request) { //初始化一下必要的请求数据 $id = 'xxx'; //AccessK

  • springboot整合阿里云oss上传的方法示例

    OSS申请和配置 1. 注册登录 输入网址:https://www.aliyun.com/product/oss 如果没有账号点击免费注册,然后登录. 2.开通以及配置 点击立即开通 进入管理控制台 第一次使用会出现引导,按引导点击"我知道了",然后点击创建Bucket. 如果没有存储包或流量包点击购买. 点击确定,返回主页面,出现该页面,点击我知道了 将EndPoint记录下来,方便后期添加到我们项目的配置文件中 创建 AccessKeyID 和 AccessKeySecret 点击

  • SpringBoot整合阿里云OSS对象存储服务实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文档,这个获取值本身就不难. 重点:记下你的AccessKey ID.AccessKey Secret以及你刚才创建的Buacket名字BucketName. 2. 配置: 在pom里引入oss要用的依赖 <dependency> <groupId>com.aliyun.oss</

  • SpringBoot整合阿里云OSS对象存储服务的实现

    今天来整合一下SpringBoot和阿里云OSS对象存储服务. 一.配置OSS服务 先在阿里云开通对象存储服务,拿到AccessKeyId.AccessKeySecret. 创建你的bucket(存储空间),相当于一个一个的文件夹目录.按业务需求分类存储你的文件,图片,音频,app包等等.创建bucket是要选择该bucket的权限,私有,公共读,公共读写,按需求选择.创建bucket时对应的endpoint要记住,上传文件需要用到. 可以配置bucket的生命周期,比如说某些文件有过期时间的,

随机推荐