强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

【前言】

我们上家公司的存储系统用的是FastDFS(智能一代云平台(二十八):对前后端分离和FastDFS的使用的再理解);现在在职的公司用的是阿里云的OSS(OSS的官方文档),在工作的时候整理一个上传OSS文件的工具类,现在与大家分享一下。

【工具类】

1、工具类的代码:

package zhanghan.oss.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import com.fasterxml.jackson.annotation.JsonValue;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import zhanghan.oss.exception.OSSCreateBucketRuntimeException;
import zhanghan.oss.exception.OSSGeneratePresignedUrlRuntimeException;
import zhanghan.oss.exception.OssPutObjectRuntimeException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.UUID;/*** OSS上传工具类-张晗-2017/10/10*/
public class OSSUtil {private volatile static OSSClient instance;private OSSUtil() {}/*** 单例* @return  OSS工具类实例*/private static OSSClient getOSSClient() {if (instance == null) {synchronized (OSSUtil.class) {if (instance == null) {instance = new OSSClient(OSS_END_POINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);}}}return instance;}//定义日志private final static LogUtils logger = LogUtils.getLogger(OSSUtil.class);//OSS 的地址private final static String OSS_END_POINT = "http://oss-cn-qingdao.aliyuncs.com";//OSS 的key值private final static String OSS_ACCESS_KEY_ID = "OSSKEY";//OSS 的secret值private final static String OSS_ACCESS_KEY_SECRET = "OSSSECRET";//OSS 的bucket名字private final static String OSS_BUCKET_NAME = "zhanghan-test";//设置URL过期时间为10年private final static Date OSS_URL_EXPIRATION = DateUtils.addDays(new Date(), 365 * 10);//文件路径的枚举public enum FileDirType {ZHANGHAN_TEST("test");private String dir;FileDirType(String dir) {this.dir = dir;}@JsonValuepublic String getDir() {return dir;}}/*** 上传文件---去除URL中的?后的时间戳* @param file 文件* @param fileDir 上传到OSS上文件的路径* @return 文件的访问地址*/public static String upload(MultipartFile file, FileDirType fileDir) {OSSUtil.createBucket();String fileName = OSSUtil.uploadFile(file, fileDir);String fileOssURL = OSSUtil.getImgUrl(fileName, fileDir);int firstChar = fileOssURL.indexOf("?");if (firstChar > 0) {fileOssURL = fileOssURL.substring(0, firstChar);}return fileOssURL;}/*** 当Bucket不存在时创建Bucket** @throws OSSException 异常* @throws ClientException Bucket命名规则:*                         1.只能包含小写字母、数字和短横线,*                         2.必须以小写字母和数字开头和结尾*                         3.长度在3-63之间*/private static void createBucket() {try {if (!OSSUtil.getOSSClient().doesBucketExist(OSS_BUCKET_NAME)) {//判断是否存在该Bucket,不存在时再重新创建OSSUtil.getOSSClient().createBucket(OSS_BUCKET_NAME);}} catch (Exception e) {logger.error("{}", "创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)");throw new OSSCreateBucketRuntimeException("创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)");}}/*** 上传到OSS服务器  如果同名文件会覆盖服务器上的* @param file 文件* @param fileDir  上传到OSS上文件的路径* @return 文件的访问地址*/private static String uploadFile(MultipartFile file, FileDirType fileDir) {String fileName = String.format("%s.%s",UUID.randomUUID().toString(),FilenameUtils.getExtension(file.getOriginalFilename()));try (InputStream inputStream = file.getInputStream()) {//创建上传Object的MetadataObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentLength(inputStream.available());objectMetadata.setCacheControl("no-cache");objectMetadata.setHeader("Pragma", "no-cache");objectMetadata.setContentType(getContentType(FilenameUtils.getExtension("." + file.getOriginalFilename())));objectMetadata.setContentDisposition("inline;filename=" + fileName);//上传文件PutObjectResult putResult = OSSUtil.getOSSClient().putObject(OSS_BUCKET_NAME, fileDir.getDir() + fileName, inputStream, objectMetadata);return fileName;} catch (Exception e) {logger.error("{}", "上传文件失败");throw new OssPutObjectRuntimeException("上传文件失败");}}/*** 获得文件路径* @param fileUrl  文件的URL* @param fileDir  文件在OSS上的路径* @return 文件的路径*/private static String getImgUrl(String fileUrl, FileDirType fileDir) {if (StringUtils.isEmpty(fileUrl)) {logger.error("{}", "文件地址为空");throw new RuntimeException("文件地址为空");}String[] split = fileUrl.split("/");//获取oss图片URL失败URL url = OSSUtil.getOSSClient().generatePresignedUrl(OSS_BUCKET_NAME, fileDir.getDir() + split[split.length - 1], OSS_URL_EXPIRATION);if (url == null) {logger.error("{}", "获取oss文件URL失败");throw new OSSGeneratePresignedUrlRuntimeException("获取oss文件URL失败");}return url.toString();}/*** 判断OSS服务文件上传时文件的contentType** @param FilenameExtension 文件后缀* @return 后缀*/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";}return "image/jpeg";}
}

2、调用工具类的代码:

   /*** 上传文件测试* @param multipartFile 待上传的文件* @return  上传在OSS文件的访问路径* @throws BusinessException  上传异常*/public String uploadTest(MultipartFile multipartFile) throws BusinessException{try {uploadResult = OSSUtil.upload(multipartFile, OSSUtil.FileDirType.ZHANGHAN_TEST);} catch (Exception e) {LoggerUtil.logService(LoggerUtil.spManualLoan, "SPManualLoanServiceImpl-submitLoan", "call OSSUtil.upload; Exception:" + e.getMessage());throw new BusinessException(WrongMessageEnum.EXCEPTION_STORE);}return uploadResult;}

3、问题&解决:

(1) 问题:通过URL在浏览器中访问时报如下错:

(2)解决方案:在阿里云的控制台上,进入OSS的设置界面,将Bucket的访问权限由 私有 设置为 公共读

【总结】

阿里云现在很多公司都在用,阿里云稳定,安全,相对来说成本更低;给自己更多思考的是如何让项目减少成本,以及阿里云等带来的商业模式。

OSS(一):OSS工具类相关推荐

  1. 阿里云oss文件处理工具类

    maven依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk- ...

  2. java上传文件至阿里云oss工具类

    第一步:引入oss maven坐标 <dependency><groupId>com.aliyun.oss</groupId><artifactId>a ...

  3. 若依-vue图片上传本地改OSS前台以及后台-附带oss图片上传工具类

    阿丹: 在二次开发若依的过程中发现若依的图片上传的默认的是在本地,在spring-vue版本中,如果要将平台上线那么就需要考虑这个问题,要使用fastdfs或者oss来完成代替本地的图片上传. 本篇文 ...

  4. java的springboot项目操作阿里云OSS下载文件、查看文件内容、上传文件,自定义工具类

    因为要从oss下载.查看.上传工具类,所以对这几个方法做了一个封装,已经经过测试,可以直接使用 1.yml添加上阿里云配置.添加maven配置 注意这里的objectName: xxx/xxx/,前面 ...

  5. 阿里云OSS文件上传下载工具类

    引入依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss ...

  6. Java 上传图片至OSS并返回图片地址工具类可直接用

    OSS上传图片并返回图片地址工具类 OSS上传图片并且返回地址工具类 可以直接拿去用 后续会继续更新 需要注意的点: 下面代码里的@Value里的几个值我是放在application.yml文件里的, ...

  7. 阿里云oss上传下载删除工具类

    工具类-阿里云oss private static String accessId;private static String accessKey;private static String endp ...

  8. 阿里云oss文件上传工具类

    阿里云oss文件上传工具类 阿里云oss 阿里云oss 导入文件阿里云oss的maven依赖 <!-- 阿里云oss依赖 --><dependency><groupId& ...

  9. Java 常用工具类(9) : 图片上传至阿里云OSS

    阿里云OSS工具类 加强版 : https://blog.csdn.net/Lxinccode/article/details/79698259 import java.io.ByteArrayInp ...

  10. Java中阿里云OSS文件上传工具类

    阿里云OSS文件上传下载工具类 前言: 本质上就是获取配置文件信息,然后注入bean,调用sdk中提供的增删改方法: 为了避免同名文件会替换,用了hutool中唯一id生成+文件名做拼接 导入依赖:→ ...

最新文章

  1. 百度Apollo发布海量自动驾驶数据集,还有两项重磅挑战赛
  2. 最完美的ASCII 表
  3. 从一个前端项目实践 Git flow 的流程与参考
  4. 书写神器——markdown
  5. kotlin学习之解构声明(十二)
  6. 砸4亿美元,GE豪赌的全球最大风力发电机到底多大?
  7. 数据结构 - 队列(图解+源码)
  8. LeetCode-计数质数
  9. c#数据类型的值传递和引用传递--基础拾遗
  10. 剑指offer之按之字形打印二叉树
  11. 查询oracle表空间有什么数据,oracle查询表空间使用情况与查询有哪些数据库实例在运行...
  12. RHCE 学习笔记(4)- 重定向,管道和VIM编辑器
  13. 一个人的职业生涯之旅 —— 应届生求职、面试、Offer、跳槽(发展瓶颈、薪资倒挂、职业倦怠、骑驴找马、简历优化)问题分享
  14. bzoj2101: [Usaco2010 Dec]Treasure Chest 藏宝箱
  15. 查看已下载的Docker镜像latest具体版本
  16. 2020年裸辞的人,真的待业了一整年吗?
  17. CMake Error: The current CMakeCache.txt directory is different...
  18. python 好用的库存尾货女装_利用python对女装评价进行分析
  19. 【2.25】认识Redis
  20. Xshell连接云服务器并连接宝塔面板(天翼云为例)

热门文章

  1. w7电脑蓝屏怎么解决_Win7电脑突然蓝屏怎么办?
  2. Tomcat开启APR运行模式,优化并发性能
  3. 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。【需要修改】
  4. 中华神话传说中神仙全表(ZZ)
  5. OpenBSD 6.8 切换到国内镜像源的一种临时方法:声明PKG_PATH
  6. 桌面虚拟化:软件为先
  7. 技术管理之巅-如何从零打造高质效互联网技术团队?
  8. C# 之 观察者模式实例 -- 订牛奶
  9. Dragonfly 基于 P2P 的文件和镜像分发系统
  10. 猜一猜,我国第一次大规模应用二维码是什么时候?