Spring Boot 整合 阿里云OSS上传

  • OSS申请和配置
    • 1. 注册登录
    • 2.开通以及配置
  • springboot整合使用
    • 1. 进入我们springboot的项目中,导入oss相关依赖
    • 2. 再配置文件中添加相关信息
    • 3. 书写获取配置信息的java文件,建立properties包(导入依赖,否则无法识别这个包)
    • 4. 整合oss,书写相关java文件
      • 1. 文件常量java文件 FileConstants.java
      • 2. 文件操作工具类 OssFileUtils.java
      • 3. 阿里云 对象云存储工具类 OssUtil.java
    • 5. controller 调用样例

OSS申请和配置

1. 注册登录

输入网址:https://www.aliyun.com/product/oss

如果没有账号点击免费注册,然后登录。

2.开通以及配置

  1. 点击立即开通
  2. 进入管理控制台
  3. 第一次使用会出现引导,按引导点击“我知道了”,然后点击创建Bucket。

  4. 如果没有存储包或流量包点击购买。
  5. 点击确定,返回主页面,出现该页面,点击我知道了
  6. 将EndPoint记录下来,方便后期添加到我们项目的配置文件中
  7. 创建 AccessKeyID 和 AccessKeySecret

    点击创建Access key,第一次需要短信验证,验证成功后弹出
    保留Access key 以及 AccessKeySecret 信息

springboot整合使用

1. 进入我们springboot的项目中,导入oss相关依赖

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

2. 再配置文件中添加相关信息

oss.aliyun.accessKeyId= #
oss.aliyun.accessKeySecret= #
oss.aliyun.bucketName= mutest-qcby-oss
oss.aliyun.endpoint= #
oss.aliyun.pubFlag= false
oss.aliyun.expiration= 100
oss.aliyun.sslNmae= #内网使用,不必须

3. 书写获取配置信息的java文件,建立properties包(导入依赖,否则无法识别这个包)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>


OssProerties.java

import com.mbyte.easy.oss.OssUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;/*** @ClassName: OssProerties* @Description: 阿里云 对象云存储配置类* @Author: zte* @Date: 2019-02-14 09:37* @Version 1.0**/
@Data
@Component
@ConfigurationProperties(prefix = "oss.aliyun")
public class OssProerties {private  String accessKeyId;private  String accessKeySecret;private  String bucketName;private  String endpoint;private  String bucket;private  boolean pubFlag;private  String sslNmae;@PostConstructpublic void init(){//Oss工具类配置初始化OssUtil.initConfig(this);}//过期时间private  int  expiration;public String getAccessKeyId() {return accessKeyId;}public OssProerties setAccessKeyId(String accessKeyId) {this.accessKeyId = accessKeyId;return this;}public String getAccessKeySecret() {return accessKeySecret;}public OssProerties setAccessKeySecret(String accessKeySecret) {this.accessKeySecret = accessKeySecret;return this;}public String getBucketName() {return bucketName;}public OssProerties setBucketName(String bucketName) {this.bucketName = bucketName;return this;}public String getEndpoint() {return endpoint;}public OssProerties setEndpoint(String endpoint) {this.endpoint = endpoint;return this;}public String getBucket() {return bucket;}public OssProerties setBucket(String bucket) {this.bucket = bucket;return this;}public boolean isPubFlag() {return pubFlag;}public void setPubFlag(boolean pubFlag) {this.pubFlag = pubFlag;}public int getExpiration() {return expiration;}public OssProerties setExpiration(int expiration) {this.expiration = expiration;return this;}@Overridepublic String toString() {return "OssPro{" +"accessKeyId='" + accessKeyId + '\'' +", accessKeySecret='" + accessKeySecret + '\'' +", bucketName='" + bucketName + '\'' +", endpoint='" + endpoint + '\'' +", bucket='" + bucket + '\'' +", expiration=" + expiration +'}';}
}

4. 整合oss,书写相关java文件

1. 文件常量java文件 FileConstants.java

package com.mbyte.easy.oss;import org.springframework.util.ClassUtils;import java.io.File;/*** @ClassName: FileConstants* @Description: 文件常量* @Author: zte* @Date: 2019-02-19 09:59* @Version 1.0**/
public class FileConstants {/*** 文件存储临时文件夹*/public final static String TEMP_ROOT = "temp";/*** 下载暂存目录*/public final static String DOWNLOAD = TEMP_ROOT+ File.separator+"download";/*** 后缀名相关常量(包含【.】)*/public final static String SUFFIX_ZIP = ".zip";/*** png图片后缀*/public final static String SUFFIX_png = ".png";/*** 二维码暂存路径 eg:微信支付二维码*/public static final String QRCODE = "qrcode";public static final String QRCODE_PATH = ClassUtils.getDefaultClassLoader().getResource("static").getPath()+File.separator+QRCODE;/*** 文件的后缀名*/public static final String FILE_TYPE_AVI  = "avi";public static final String FILE_TYPE_CSV = "csv";public static final String FILE_TYPE_DOC  = "doc";public static final String FILE_TYPE_DOCX  = "docx";public static final String FILE_TYPE_MP3 = "mp3";public static final String FILE_TYPE_PDF  = "pdf";public static final String FILE_TYPE_PPT  = "ppt";public static final String FILE_TYPE_PPTX  = "pptx";public static final String FILE_TYPE_RAR  = "rar";public static final String FILE_TYPE_TXT  = "txt";public static final String FILE_TYPE_XLS = "xls";public static final String FILE_TYPE_ZIP  = "zip";/*** 文件对应图片的oss路径*/public static final String FILE_TYPE_AVI_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092751242.U27AJS.png?Expires=4731182871&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=0S4nIClHiI11Iw2SOnLoKuwpiDc%3D";public static final String FILE_TYPE_CSV_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092859378.A0J8R6.png?Expires=4731182939&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=McS77A%2BMOkmSjBfZziIxLeR5QCM%3D";public static final String FILE_TYPE_DOC_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092908602.QHFWCO.png?Expires=4731182949&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=%2Fr9V%2FP8nmfYKVbANe2fl1qR%2FFwg%3D";public static final String FILE_TYPE_DOCX_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092908602.QHFWCO.png?Expires=4731182949&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=%2Fr9V%2FP8nmfYKVbANe2fl1qR%2FFwg%3D";public static final String FILE_TYPE_MP3_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092920411.L5CBAF.png?Expires=4731182960&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=wPz2ylPAg%2FpBqyIz4LztacVfRwo%3D";public static final String FILE_TYPE_PDF_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092930146.CU0CAD.png?Expires=4731182970&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=Nwl6%2BkZmosARipe%2BoVJT3FdRLqM%3D";public static final String FILE_TYPE_PPT_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092939365.XHOX9G.png?Expires=4731182979&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=3CDxl0W5ymVXe2XLnxLn1ewc1gU%3D";public static final String FILE_TYPE_PPTX_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092939365.XHOX9G.png?Expires=4731182979&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=3CDxl0W5ymVXe2XLnxLn1ewc1gU%3D";public static final String FILE_TYPE_RAR_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092949684.9OW7L9.png?Expires=4731182989&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=RCKarsekmPG3CXI5D6MLpJ4ocj4%3D";public static final String FILE_TYPE_TXT_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205092959887.TF1K0N.png?Expires=4731183000&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=9l44IQ0FZdQMcRq92PPOXlBKEFk%3D";public static final String FILE_TYPE_XLS_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205093007830.M6O08Z.png?Expires=4731183008&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=GeNmvgi7TGMq3uk9AG0%2BJRWRFY0%3D";public static final String FILE_TYPE_ZIP_ROUTE = "https://hmett.oss-cn-beijing.aliyuncs.com/20191205093017998.Q39L45.png?Expires=4731183018&OSSAccessKeyId=LTAI4FqUE3bJs9FK7Sj65JnM&Signature=djzJ7rTgH8LvCeaMfWGXUAQIpJE%3D";
}

2. 文件操作工具类 OssFileUtils.java

import com.mbyte.easy.common.web.AjaxResult;
import com.mbyte.easy.oss.OssUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.*;/*** @ClassName: DesignFileUtils* @Description: 文件操作工具类* @Author: zte* @Date: 2019-02-15 14:50* @Version 1.0**/
@Slf4j
public class OssFileUtils {/*** @Title: uploadSingleFile* @Description:  单个文件上传* @Author: zte* @param: file* @Date: 2019-02-15 14:56 * @return: java.lang.String 成功返回 文件路径,失败返回null* @throws: */public static String uploadSingleFile(MultipartFile file){if(file == null){log.error("单文件上传失败,文件为空");return null;}try {return OssUtil.upload(OssUtil.generateKey(file.getOriginalFilename()),file.getBytes());} catch (Exception e) {log.error("单文件上传异常【"+file+"】",e);}return null;}/*** @Title: uploadSingleFile* @Description:  单个文件上传* @Author: zte* @param: file* @Date: 2019-02-15 14:56* @return: java.lang.String 成功返回 文件路径,失败返回null* @throws:*/public static String uploadSingleFile(File file){if(file == null){log.error("单文件上传失败,文件为空");return null;}try {return OssUtil.upload(OssUtil.generateKey(file.getName()),file);} catch (Exception e) {log.error("单文件上传异常【"+file+"】",e);}return null;}/*** @Title: uploadMultipartFile* @Description: 多文件文件上传* @Author: zte* @param: files* @Date: 2019-02-18 13:08 * @return: java.util.List<java.lang.String> 成功返回 文件路径集合,失败返回null* @throws: */public static List<String> uploadMultipartFile(List<MultipartFile> fileList){List<String> filePaths = new ArrayList<>();Optional.ofNullable(fileList).ifPresent(fl->{fl.stream().forEach(f->{try {filePaths.add(OssUtil.upload(OssUtil.generateKey(f.getOriginalFilename()),f.getBytes()));} catch (IOException e) {log.error("多文件上传异常【"+f+"】",e);}});});return filePaths;}/*** @Title: downloadSingleFileByOss* @Description: 下载阿里云文件到本地* @Author: zte* @param: url 阿里云链接* @param: filePath 下载目录* @Date: 2019-02-18 13:13* @return: java.io.File* @throws:*/public static File downloadSingleFile(String url,String filePath){try {return OssUtil.download2File(url,filePath);} catch (Exception e) {log.error("单文件下载异常【"+url+"】",e);}return null;}/*** @Title: downloadMultipartFileByOss* @Description: 批量下载阿里云文件到本地* @Author: zte* @param: urlList 阿里云链接集合* @param: dir 下载目录* @Date: 2019-02-18 13:19* @return: java.util.List<java.io.File>* @throws:*/public static List<File> downloadMultipartFile(List<String> urlList,String dir){List<File> files = new ArrayList<>();Optional.ofNullable(urlList).ifPresent(fl->{fl.stream().forEach(f->files.add(OssUtil.download2Dir(f,dir)));});return files;}/*** @Title: isFileBySuffix* @Description: 通过后缀名判断是否是某种文件* @Author: zte* @param: fileName 文件名称* @param: suffix 后缀名* @Date: 2019-02-19 10:09* @return: boolean* @throws:*/public static boolean isFileBySuffix(String fileName,String suffix){if(StringUtils.isNoneBlank(fileName) && StringUtils.isNoneBlank(suffix)){return fileName.endsWith(suffix.toLowerCase()) || fileName.endsWith(suffix.toUpperCase());}return false;}/*** @Title: downloadByUrlPath* @Description: 下载网络文件* @Author: zte* @param: urlPath* @param: saveDir* @param: fileName* @Date: 2019-02-23 16:26* @return: java.io.File* @throws:*/public static File downloadByUrlPath(String urlPath,String saveDir,String fileName){if(StringUtils.isBlank(urlPath)){log.error("下载网络文件失败,链接为空");return null;}try (InputStream ins = new URL(urlPath).openStream()) {Path target = Paths.get(saveDir, fileName);Files.createDirectories(target.getParent());Files.copy(ins, target, StandardCopyOption.REPLACE_EXISTING);return new File(saveDir+File.separator+fileName);} catch (IOException e) {log.error("下载网络文件异常",e);}return null;}
}

3. 阿里云 对象云存储工具类 OssUtil.java

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.mbyte.easy.properties.OssProerties;
import com.mbyte.easy.util.Utility;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @ClassName: OSSUtill* @Description: 阿里云 对象云存储工具类* @Author: zte* @Date: 2019-02-13 14:38* @Version 1.0**/
@Slf4j
public class OssUtil {/*** 注入配置*/private static OssProerties ossProerties;/*** @Title: initConfig* @Description: 配置初始化* @Author: zte* @param: ossProertiesInit* @Date: 2019-02-14 09:25 * @throws: */public static void initConfig(OssProerties ossProertiesInit){ossProerties = ossProertiesInit;}/*** @Title: generateKey* @Description:  生成oss对象名称* @Author: zte* @param: fileName* @Date: 2019-02-13 15:21* @return: java.lang.String* @throws:*/public  static String generateKey(String fileName) {//对象名称格式:yyyymm.name.6位随机字符.extreturn new StringBuilder(DateFormatUtils.format(new Date(), "yyyyMMddHHmmssSSS")).append(".").append(Utility.getRandomStrByNum(6)).append(".").append(FilenameUtils.getExtension(fileName)).toString();}public static String getHttpsAddress(String url){return url.replaceAll("http://"+ossProerties.getBucket(),ossProerties.getSslNmae());}/*** @Title: upload* @Description: 上传方法* @Author: zte* @param: key 对象名称* @param: file待上传文件* @Date: 2019-02-13 15:35* @return: java.lang.String* @throws: */public  static String upload(String key,File file) {if(file == null || !file.exists()){log.error("阿里云上传文件失败【"+file+"】不存在");return null;}log.info("阿里云上传文件开始:【"+file+"】");OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try {ossClient.putObject(ossProerties.getBucketName(),key,file);//设置url过期时间Date expirationDate = DateUtils.addYears(new Date(), ossProerties.getExpiration());String url = ossClient.generatePresignedUrl(ossProerties.getBucketName(), key, expirationDate).toString();log.info("阿里云上传文件结束:【"+file+"】=>【"+url+"】");return getHttpsAddress(url);}catch(Exception e) {log.error("阿里云上传文件异常【"+file+"】",e);}finally {ossClient.shutdown();}return null;}/*** @Title: upload* @Description: 上传方法* @Author: zte* @param: key 对象名称* @param: file待上传文件* @Date: 2019-02-13 15:35* @return: java.lang.String* @throws:*/public  static String upload(String key,byte[] bytes) {if(bytes == null || StringUtils.isBlank(key)){log.error("阿里云上传文件不存在:【"+key+"】");return null;}log.info("阿里云上传文件开始:【"+key+"】");OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try {ossClient.putObject(ossProerties.getBucketName(),key, new ByteArrayInputStream(bytes));//设置url过期时间Date expirationDate = DateUtils.addYears(new Date(), 100);String url = ossClient.generatePresignedUrl(ossProerties.getBucketName(), key, expirationDate).toString();log.info("阿里云上传文件结束:【"+key+"】=>【"+url+"】");return getHttpsAddress(url);}catch(Exception e) {log.error("阿里云上传文件异常:【"+key+"】",e);}finally {ossClient.shutdown();}return null;}/*** @Title: uploadWithObjectName* @Description: 上传方法,返回对象名称和 url* @Author: zte* @param: file待上传文件* @Date: 2019-02-13 15:35* @return: java.lang.Map<String,String>* @throws:*/public  static Map<String,String> uploadWithObjectName(File file) {if(file == null || !file.exists()){log.error("阿里云上传文件失败【"+file+"】不存在");return null;}Map<String,String> map = new HashMap<>();log.info("阿里云上传文件开始:【"+file+"】");OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try {String key = generateKey(file.getName());ossClient.putObject(ossProerties.getBucketName(),key, new FileInputStream(file));//设置url过期时间Date expirationDate = DateUtils.addYears(new Date(), ossProerties.getExpiration());String url = ossClient.generatePresignedUrl(ossProerties.getBucketName(), key, expirationDate).toString();log.info("阿里云上传文件结束:【"+file+"】=>【"+url+"】");map.put("objectName",key);map.put("url",url);return map;}catch(Exception e) {log.error("阿里云上传文件异常【"+file+"】",e);}finally {ossClient.shutdown();}return null;}/*** @Title: delete* @Description: 删除方法* @Author: zte* @param: url 待删除对象url* @Date: 2019-02-13 15:54 * @throws: */public  static void delete(String url) {if(StringUtils.isBlank(url)){log.error("阿里云删除文件失败,对象url为空");return;}log.info("阿里云删除文件开始:【"+url+"】");if(url.contains(ossProerties.getBucket())){//根据url获取对象名称url = getObjectNameByUrl(url);}OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try {// 删除文件ossClient.deleteObject(ossProerties.getBucketName(), url);log.info("阿里云删除文件结束:【"+url+"】");}catch(Exception e) {log.error("阿里云删除文件异常【"+url+"】",e);}finally {ossClient.shutdown();}}/*** @Title: download* @Description: 下载文件到本地文件* @Author: zte* @param: url 待下载对象url* @param: filePath 下载到本地文件* @Date: 2019-02-13 15:56* @return: java.io.File* @throws: */public static File download2File(String url, String filePath) {log.info("阿里云下载文件开始:【"+url+"】");if(url.contains(ossProerties.getBucket())){//根据url获取对象名称url = getObjectNameByUrl(url);}OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try {File file = new File(filePath);// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。ossClient.getObject(new GetObjectRequest(ossProerties.getBucketName(), url),file);log.info("阿里云下载文件结束:【"+url+"】");return file;}catch(Exception e) {log.error("阿里云下载文件异常【"+url+"】",e);}finally {ossClient.shutdown();}return null;}/*** @Title: download* @Description: 通过流下载文件* @Author: zte* @param: url 待下载对象url* @param: filePath 下载到本地文件* @Date: 2019-02-13 15:56* @return: java.io.File* @throws:*/public static void download2FileByStream(String url, String fileName, HttpServletResponse response) {BufferedInputStream inputStream = null;OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try(BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());){// 配置文件下载response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");if(url.contains(ossProerties.getBucket())){//根据url获取对象名称url = getObjectNameByUrl(url);}// 下载文件能正常显示中文response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(StringUtils.isBlank(fileName) ? url : fileName, "UTF-8"));log.info("阿里云下载文件开始:【"+url+"】");// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。OSSObject ossObject = ossClient.getObject(ossProerties.getBucketName(), url);inputStream = new BufferedInputStream(ossObject.getObjectContent());byte[] buff = new byte[2048];int bytesRead;while (-1 != (bytesRead = inputStream.read(buff, 0, buff.length))){outputStream.write(buff, 0, bytesRead);}outputStream.flush();} catch (Exception e) {log.error("下载异常!", e);}finally {log.info("阿里云下载文件结束:【"+url+"】");ossClient.shutdown();if(inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}/*** @Title: download* @Description: 下载文件到指定目录,文件名称为阿里云文件对象名称* @Author: zte* @param: url 待下载对象url* @param: dir 下载到本地目录* @Date: 2019-02-13 15:56* @return: java.io.File* @throws:*/public static File download2Dir(String url, String dir) {log.info("阿里云下载文件开始:【"+url+"】");if(url.contains(ossProerties.getBucket())){//根据url获取对象名称url = getObjectNameByUrl(url);}OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try {File file = new File(dir+File.separator+url);// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。ossClient.getObject(new GetObjectRequest(ossProerties.getBucketName(), url),file);log.info("阿里云下载文件结束:【"+url+"】");return file;}catch(Exception e) {log.error("阿里云下载文件异常【"+url+"】",e);}finally {ossClient.shutdown();}return null;}/** @Title: getObjectNameByUrl* @Description: 通过url获取对象名称* @Author: zte* @param: url* @Date: 2019-02-13 16:20 * @return: java.lang.String* @throws: */public  static String getObjectNameByUrl(String url){if(StringUtils.isBlank(url)){return null;}return url.substring(url.indexOf(ossProerties.getBucket())+ossProerties.getBucket().length()+1,url.indexOf("?"));}/*** @author: zte* @description: 重载方法,根据file生成文件名称并且上传文件到阿里云* @date: 2019/9/21 10:56* @param file : MultipartFile文件* @see #upload(String,byte[])* @return 数据库中要存入的路径*/public static String upload(MultipartFile file) throws IOException {if (file == null || Strings.isEmpty(file.getOriginalFilename())){return null;}return upload(generateKey(file.getOriginalFilename()), file.getBytes());}/*** 调用浏览器下载* @param url* @param response*/public static void download2FileByStream(String url,HttpServletResponse response,String name) {File file = new File(url);String fileName=file.getName();fileName= StringUtils.substringBefore(fileName,"?");String fileLast=StringUtils.substringAfterLast(fileName,".");fileName=name+"."+fileLast;BufferedInputStream inputStream = null;OSS ossClient = new OSSClient(ossProerties.getEndpoint(), ossProerties.getAccessKeyId(), ossProerties.getAccessKeySecret());try(BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());){// 配置文件下载response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");if(url.contains(ossProerties.getBucket())){//根据url获取对象名称url = getObjectNameByUrl(url);}// 下载文件能正常显示中文response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(StringUtils.isBlank(fileName) ? url : fileName, "UTF-8"));log.info("阿里云下载文件开始:【"+url+"】");// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。OSSObject ossObject = ossClient.getObject(ossProerties.getBucketName(), url);inputStream = new BufferedInputStream(ossObject.getObjectContent());byte[] buff = new byte[2048];int bytesRead;while (-1 != (bytesRead = inputStream.read(buff, 0, buff.length))){outputStream.write(buff, 0, bytesRead);}outputStream.flush();} catch (Exception e) {log.error("下载异常!", e);}finally {log.info("阿里云下载文件结束:【"+url+"】");ossClient.shutdown();if(inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
}

5. controller 调用样例

我这里使用的是我自己项目封装的 AjaxResult工具类,大家可以使用Map,通过这个方法呢,我们就可以使用oss将图片保存,并且返回前端图片的保存地址(可以访问)。

/*** 上传* @param fileupload* @return*/@PostMapping("uploadImg")@ResponseBodypublic AjaxResult uploadImg(MultipartFile fileupload){if(fileupload != null){String path = OssFileUtils.uploadSingleFile(fileupload);return AjaxResult.success(path);}else {return AjaxResult.error();}}

spring boot 整合 阿里云oss上传相关推荐

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

    这篇文章主要介绍了springboot整合阿里云oss上传的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 OSS申请和 ...

  2. SpringBoot整合阿里云OSS上传文件

    一.需求分析 文件上传是一个非常常见的功能,就是通过IO流将文件写到另外一个地方,这个地方可以是项目下的某个文件夹里,或者是本地电脑某个盘下面,还可以是云服务OSS里面,这里就是我要讲到的OSS,我写 ...

  3. 第三方服务整合-阿里云OSS上传文件-填坑

    目录 如下,引入aliyun-oss失败: 原因: 解决方法 OssController 如下,引入aliyun-oss失败: com.alibaba.cloud:aliyun-oss-spring- ...

  4. Java实现阿里云OSS上传文件

    推荐:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.. 点击跳转到网站 1.准备工作:创建操作阿里云OSS许可证 阿里云官方文档 这里不再赘述,根据官方文档一步步的 ...

  5. Springboot集成 阿里云OSS上传及下载

    文章目录 使用手册 maven依赖及环境配置 定义配置bean及OSS工具类 定义UploadController和DownloadController 下载接口优化为返回重定向oss路径 遇到的问题 ...

  6. Nginx 代理转发阿里云OSS上传的实现代码

    这篇文章主要介绍了Nginx 代理转发阿里云OSS上传的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 前言 因为小程序上传需要https,服务器https用的是 ...

  7. thinkPHP 阿里云OSS 上传文件、直接下载

    阿里云OSS 上传文件.直接下载 1. 安装OSS SDK composer require aliyuncs/oss-sdk-php 2. thinkPHP接口 public function up ...

  8. 阿里云OSS上传文件设置请求头

    之前写过一篇发送文件消息的,原生input上传文件(聊天发送文件消息),这次的需求就是更改上传地址,使用阿里云OSS上传. 如果想了解阿里云对象存储OSS是如何使用的,请看阿里云存储对象OSS使用讲解 ...

  9. 阿里云oss上传svg等格式的文件,返回的路径打开后是下载而不是预览

    在做的一个项目,阿里云oss上传svg等格式的文件,返回的路径打开后是下载而不是预览.之后web同事跟产品说不好处理,换回了使用jpg格式的文件.但是最终这个问题都是要解决的,产品要求下期也要上传sv ...

最新文章

  1. Git 常用命令清单
  2. 初三学生多会筹备计算机中考考试,2020年的初中生注意,中考将会发生这几大变化,最好提前准备...
  3. 用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图
  4. ubuntu安装c/c++编译环境
  5. win10系统怎么写java_win10系统制作java文本的操作方法
  6. Sentinel系统规则_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0044
  7. 关于SSH使用的一些经验
  8. Windows下PyMC安装
  9. 《离散数学及其应用》【张清华版】 第四章习题总结
  10. Maya模型导入到Unity3d 的秘诀
  11. Angular最新教程-第七节HTTP get post 设置头部 跨域访问
  12. party_bid_core总结
  13. 机器学习环境配置(Tesla K80安装PyTorch的全过程)
  14. matlab画平面心型线,如何用matlab画出心形线
  15. MacTeX添加.sty文件
  16. CSDN-markdown语法之怎样使用LaTeX语法编写数学公式
  17. php 锁屏,windows锁屏快捷键是什么
  18. 个人常用的sql脚本语句
  19. chm文件打开是空白页面,可能是文件被锁定,文件解锁方法
  20. FICO_通过参考创建方式批量复制跨科目表的总账科目

热门文章

  1. windows终端事件日志监控指南
  2. 如何解决电脑太卡的问题
  3. oracle去重函数
  4. db2与mysql编目_DB2 数据库编目
  5. 学习python的第7天距离大师100天还差93天
  6. 如何入驻多商户商城系统
  7. 该博客的相关美(chou)化
  8. 【PTA】【数据结构与算法】最小生成树
  9. PubSub模式简单实现
  10. 2440 dm9000 到底咋确定地址