一、什么是对象存储OSS

1、阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。

2、其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%

3、OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

二、对象存储OSS作用

1、阿里云对象存储OSS简单的说就是我们花钱在阿里购买存储空间
2、然后我们可以将项目中的图片文件等资源存储在对象存储OSS服务器上
3、对象存储OSS提供对文件的上传,下载, 删除等管理操作
4、这样我们就省去了购买存储服务器, 搭建存储服务器, 运营管理存储服务器的繁琐操作.
5、本方案适用于中小型规模公司, 对于并发量, 存储的数据量不大的情况下使用, 因为如果高并发大数据量阿里虽然也支持, 但是每年付出的费用相当昂贵, 这个时候可以选用FastDFS自己去购买服务器搭建并运营管理. 则更省钱.500mb hadoop

三、对象存储OSS概念

存储类型(Storage Class): OSS提供标准、低频访问、归档、冷归档四种存储类型, 针对不同数据使用频率.

存储空间(Bucket): 存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。

对象(Object): 对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。

地域(Region): 地域表示OSS的数据中心所在物理位置

访问域名(Endpoint): Endpoint表示OSS对外服务的访问域名

访问密钥(AccessKey): EndpoiAccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份nt表示OSS对外服务的访问域名

四、OSS的使用

1、登录和注册

image.png

2、选择OSS

image.png

3、选择机型

image.png

4、点击购买

image.png

5、选择控制台

image.png

6、进入OOS

image.png

7.配置bucket

image.png

image.png

8、查看 key和id

image.png

image.png

五、java操作OSS

1、查看API文档

image.png

2、api文档

image.png

image.png

3、创建springboot项目

导入依赖

  1. JDK8 以下版本
  2. <dependency>
  3. <groupId>com.aliyun.oss</groupId>
  4. <artifactId>aliyun-sdk-oss</artifactId>
  5. <version>3.10.2</version>
  6. </dependency>
  7. JDK9以上版本
  8. <dependency>
  9. <groupId>javax.xml.bind</groupId>
  10. <artifactId>jaxb-api</artifactId>
  11. <version>2.3.1</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>javax.activation</groupId>
  15. <artifactId>activation</artifactId>
  16. <version>1.1.1</version>
  17. </dependency>
  18. <!-- no more than 2.3.3-->
  19. <dependency>
  20. <groupId>org.glassfish.jaxb</groupId>
  21. <artifactId>jaxb-runtime</artifactId>
  22. <version>2.3.3</version>
  23. </dependency>

4、编写OSS工具类

定义开发key

  1. // endpoint
  2. private String endpoint = "https://oss-cn-beijing.aliyuncs.com";
  3. // accessKey
  4. private String accessKeyId = "LTAI5tMBzRMrGk1p3cinHY9w";
  5. private String accessKeySecret = "GkAphDCxzqsENzitdDDM5B3di3Q2Qx";
  6. // 空间
  7. private String bucketName = "zhougz1985";
  8. // 文件存储目录
  9. private String filedir = "";

编写构造方法

  1. public OSSClientUtil() {
  2. ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  3. }

销毁方法

  1. /**
  2. * 销毁
  3. */
  4. public void destory() {
  5. ossClient.shutdown();
  6. }

文件上传方法

  1. /**
  2. * 上传图片
  3. *
  4. * @param url
  5. */
  6. public void uploadImg2Oss(String url) throws Exception {
  7. File fileOnServer = new File(url);
  8. FileInputStream fin;
  9. try {
  10. fin = new FileInputStream(fileOnServer);
  11. String[] split = url.split("/");
  12. this.uploadFile2OSS(fin, split[split.length - 1]);
  13. } catch (FileNotFoundException e) {
  14. throw new FileUploadException("图片上传失败");
  15. }
  16. }
  17. public String uploadImg2Oss(MultipartFile file) throws Exception {
  18. if (file.getSize() > 10 * 1024 * 1024) {
  19. throw new FileUploadException("上传图片大小不能超过10M!");
  20. }
  21. String originalFilename = file.getOriginalFilename();
  22. String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
  23. Random random = new Random();
  24. String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
  25. try {
  26. InputStream inputStream = file.getInputStream();
  27. this.uploadFile2OSS(inputStream, name);
  28. return name;
  29. } catch (Exception e) {
  30. throw new FileUploadException("图片上传失败");
  31. }
  32. }

文件上传路径

  1. /**
  2. * 获得图片路径
  3. *
  4. * @param fileUrl
  5. * @return
  6. */
  7. public String getImgUrl(String fileUrl) {
  8. System.out.println("fileuel"+fileUrl);
  9. if (!StringUtils.isEmpty(fileUrl)) {
  10. String[] split = fileUrl.split("/");
  11. return this.getUrl(this.filedir + split[split.length - 1]);
  12. }
  13. return null;
  14. }
  15. /**
  16. * 获得url链接
  17. *
  18. * @param key
  19. * @return
  20. */
  21. public String getUrl(String key) {
  22. System.out.println("key"+key);
  23. // 设置URL过期时间为10年 3600l* 1000*24*365*10
  24. Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
  25. // 生成URL
  26. URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
  27. if (url != null) {
  28. return url.toString();
  29. }
  30. return null;
  31. }

文件上传OSS

  1. /**
  2. * 上传到OSS服务器 如果同名文件会覆盖服务器上的
  3. *
  4. * @param instream
  5. * 文件流
  6. * @param fileName
  7. * 文件名称 包括后缀名
  8. * @return 出错返回"" ,唯一MD5数字签名
  9. */
  10. public String uploadFile2OSS(InputStream instream, String fileName) {
  11. String ret = "";
  12. try {
  13. // 创建上传Object的Metadata
  14. ObjectMetadata objectMetadata = new ObjectMetadata();
  15. objectMetadata.setContentLength(instream.available());
  16. objectMetadata.setCacheControl("no-cache");
  17. objectMetadata.setHeader("Pragma", "no-cache");
  18. objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
  19. objectMetadata.setContentDisposition("inline;filename=" + fileName);
  20. // 上传文件
  21. PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);
  22. ret = putResult.getETag();
  23. } catch (IOException e) {
  24. logger.error(e.getMessage(), e);
  25. } finally {
  26. try {
  27. if (instream != null) {
  28. instream.close();
  29. }
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. return ret;
  35. }

文件类型

  1. /**
  2. * Description: 判断OSS服务文件上传时文件的contentType
  3. *
  4. * 文件后缀
  5. * @return String
  6. */
  7. public static String getcontentType(String filenameExtension) {
  8. if (filenameExtension.equalsIgnoreCase("bmp")) {
  9. return "image/bmp";
  10. }
  11. if (filenameExtension.equalsIgnoreCase("gif")) {
  12. return "image/gif";
  13. }
  14. if (filenameExtension.equalsIgnoreCase("jpeg") || filenameExtension.equalsIgnoreCase("jpg")
  15. || filenameExtension.equalsIgnoreCase("png")) {
  16. return "image/jpeg";
  17. }
  18. if (filenameExtension.equalsIgnoreCase("html")) {
  19. return "text/html";
  20. }
  21. if (filenameExtension.equalsIgnoreCase("txt")) {
  22. return "text/plain";
  23. }
  24. if (filenameExtension.equalsIgnoreCase("vsd")) {
  25. return "application/vnd.visio";
  26. }
  27. if (filenameExtension.equalsIgnoreCase("pptx") || filenameExtension.equalsIgnoreCase("ppt")) {
  28. return "application/vnd.ms-powerpoint";
  29. }
  30. if (filenameExtension.equalsIgnoreCase("docx") || filenameExtension.equalsIgnoreCase("doc")) {
  31. return "application/msword";
  32. }
  33. if (filenameExtension.equalsIgnoreCase("xml")) {
  34. return "text/xml";
  35. }
  36. return "image/jpeg";
  37. }

编写controller

  1. @PostMapping("/fileUpload")
  2. public String fileUpload(MultipartFile file) throws Exception{
  3. OSSClientUtil ossClient=new OSSClientUtil();
  4. String name = ossClient.uploadImg2Oss(file);
  5. String imgUrl = ossClient.getImgUrl(name);
  6. return imgUrl;
  7. }

编写html

  1. <form action="/fileUpload" method="post" enctype="multipart/form-data">
  2. <input type="file" name="file"/>
  3. <input type="submit" value="上传"/>
  4. </form>