OSS(一):OSS工具类

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 阿里云现在很多公司都在用,阿里云稳定,安全,相对来说成本更低;给自己更多思考的是如何让项目减少成本,以及阿里云等带来的商业模式。

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


【前言】

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


【工具类】

      1、工具类的代码:

packagezhanghan.oss.utils;
importcom.aliyun.oss.ClientException;
importcom.aliyun.oss.OSSClient;
importcom.aliyun.oss.OSSException;
importcom.aliyun.oss.model.ObjectMetadata;
importcom.aliyun.oss.model.PutObjectResult;
importcom.fasterxml.jackson.annotation.JsonValue;
importorg.apache.commons.io.FilenameUtils;
importorg.apache.commons.lang3.time.DateUtils;
importorg.springframework.util.StringUtils;
importorg.springframework.web.multipart.MultipartFile;
importzhanghan.oss.exception.OSSCreateBucketRuntimeException;
importzhanghan.oss.exception.OSSGeneratePresignedUrlRuntimeException;
importzhanghan.oss.exception.OssPutObjectRuntimeException;
importjava.io.InputStream;
importjava.net.URL;
importjava.util.Date;
importjava.util.UUID;
/*** OSS上传工具类-张晗-2017/10/10*/publicclassOSSUtil {
privatevolatilestaticOSSClientinstance;
privateOSSUtil() {
    }
/*** 单例* @return  OSS工具类实例*/privatestaticOSSClientgetOSSClient() {
if (instance==null) {
synchronized (OSSUtil.class) {
if (instance==null) {
instance=newOSSClient(OSS_END_POINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
                }
            }
        }
returninstance;
    }
//定义日志privatefinalstaticLogUtilslogger=LogUtils.getLogger(OSSUtil.class);
//OSS 的地址privatefinalstaticStringOSS_END_POINT="http://oss-cn-qingdao.aliyuncs.com";
//OSS 的key值privatefinalstaticStringOSS_ACCESS_KEY_ID="OSSKEY";
//OSS 的secret值privatefinalstaticStringOSS_ACCESS_KEY_SECRET="OSSSECRET";
//OSS 的bucket名字privatefinalstaticStringOSS_BUCKET_NAME="zhanghan-test";
//设置URL过期时间为10年privatefinalstaticDateOSS_URL_EXPIRATION=DateUtils.addDays(newDate(), 365*10);
//文件路径的枚举publicenumFileDirType {
ZHANGHAN_TEST("test");
privateStringdir;
FileDirType(Stringdir) {
this.dir=dir;
        }
@JsonValuepublicStringgetDir() {
returndir;
        }
    }
/*** 上传文件---去除URL中的?后的时间戳* @param file 文件* @param fileDir 上传到OSS上文件的路径* @return 文件的访问地址*/publicstaticStringupload(MultipartFilefile, FileDirTypefileDir) {
OSSUtil.createBucket();
StringfileName=OSSUtil.uploadFile(file, fileDir);
StringfileOssURL=OSSUtil.getImgUrl(fileName, fileDir);
intfirstChar=fileOssURL.indexOf("?");
if (firstChar>0) {
fileOssURL=fileOssURL.substring(0, firstChar);
        }
returnfileOssURL;
    }
/*** 当Bucket不存在时创建Bucket** @throws OSSException 异常* @throws ClientException Bucket命名规则:*                         1.只能包含小写字母、数字和短横线,*                         2.必须以小写字母和数字开头和结尾*                         3.长度在3-63之间*/privatestaticvoidcreateBucket() {
try {
if (!OSSUtil.getOSSClient().doesBucketExist(OSS_BUCKET_NAME)) {//判断是否存在该Bucket,不存在时再重新创建OSSUtil.getOSSClient().createBucket(OSS_BUCKET_NAME);
            }
        } catch (Exceptione) {
logger.error("{}", "创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)");
thrownewOSSCreateBucketRuntimeException("创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)");
        }
    }
/*** 上传到OSS服务器  如果同名文件会覆盖服务器上的* @param file 文件* @param fileDir  上传到OSS上文件的路径* @return 文件的访问地址*/privatestaticStringuploadFile(MultipartFilefile, FileDirTypefileDir) {
StringfileName=String.format(
"%s.%s",
UUID.randomUUID().toString(),
FilenameUtils.getExtension(file.getOriginalFilename()));
try (InputStreaminputStream=file.getInputStream()) {
//创建上传Object的MetadataObjectMetadataobjectMetadata=newObjectMetadata();
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);
//上传文件PutObjectResultputResult=OSSUtil.getOSSClient().putObject(OSS_BUCKET_NAME, fileDir.getDir() +fileName, inputStream, objectMetadata);
returnfileName;
        } catch (Exceptione) {
logger.error("{}", "上传文件失败");
thrownewOssPutObjectRuntimeException("上传文件失败");
        }
    }
/*** 获得文件路径* @param fileUrl  文件的URL* @param fileDir  文件在OSS上的路径* @return 文件的路径*/privatestaticStringgetImgUrl(StringfileUrl, FileDirTypefileDir) {
if (StringUtils.isEmpty(fileUrl)) {
logger.error("{}", "文件地址为空");
thrownewRuntimeException("文件地址为空");
        }
String[] split=fileUrl.split("/");
//获取oss图片URL失败URLurl=OSSUtil.getOSSClient().generatePresignedUrl(OSS_BUCKET_NAME, fileDir.getDir() +split[split.length-1], OSS_URL_EXPIRATION);
if (url==null) {
logger.error("{}", "获取oss文件URL失败");
thrownewOSSGeneratePresignedUrlRuntimeException("获取oss文件URL失败");
        }
returnurl.toString();
    }
/*** 判断OSS服务文件上传时文件的contentType** @param FilenameExtension 文件后缀* @return 后缀*/privatestaticStringgetContentType(StringFilenameExtension) {
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  上传异常*/publicStringuploadTest(MultipartFilemultipartFile) throwsBusinessException{
try {
uploadResult=OSSUtil.upload(multipartFile, OSSUtil.FileDirType.ZHANGHAN_TEST);
        } catch (Exceptione) {
LoggerUtil.logService(LoggerUtil.spManualLoan, "SPManualLoanServiceImpl-submitLoan", "call OSSUtil.upload; Exception:"+e.getMessage());
thrownewBusinessException(WrongMessageEnum.EXCEPTION_STORE);
        }
returnuploadResult;
    }

      3、问题&解决:


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

ee.jpeg

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

df.jpeg


【总结】

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

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
C# 对象存储
C#上传阿里云OSS工具类AliOSSTool
C#上传阿里云OSS工具类AliOSSTool
412 0
|
3月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
Linux 对象存储 Windows
【答疑】对象存储OSS常见问题解答(工具类2)
1.用户咨询使用ossutil cp下载下来的文件,有什么办法可以证明和OSS上的源文件完全一致,没有出现数据丢失和更改?解答:默认情况下,ossutil 进行数据传输时都会打开 crc64 校验,可以在上传/下载/复制时使用 --disable-crc64 选项关闭 crc64 校验。
2054 0
|
Web App开发 Linux 对象存储
【答疑】对象存储OSS常见问题解答(工具类1)
1. OSS控制台不支持上传文件夹,是否有其它方式可以支持? 解答:OSS提供了ossutil工具,支持文件夹上传。 使用cp命令进行上传/下载/拷贝文件时: 使用-r选项来拷贝文件夹 详见官网说明:https://help.aliyun.com/document_detail/50561.html Github:http://github.com/aliyun/ossutil 2. OSS的URL,怎么将失效时间设置得久一点? 解答:请使用ossutil工具。
4169 0
|
6月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
5月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
|
6月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
存储 运维 安全
阿里云OSS的优势
【7月更文挑战第19天】阿里云OSS的优势
248 2
|
6月前
|
存储 API 开发工具
阿里云OSS
【7月更文挑战第19天】阿里云OSS
213 1

相关产品

  • 对象存储