Java使用阿里云OSS对象存储上传图片

2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多

分类专栏: 工作案例总结
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

示例说明
 
该案例是OSS Java SDK的示例程序,您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。
本示例中的并不包括OSS Java SDK的所有功能,详细功能及使用方法,请参看“SDK手册 > Java-SDK”,
链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/

调用OSS Java SDK的方法时,抛出异常表示有错误发生;没有抛出异常表示成功执行。
当错误发生时,OSS Java SDK的方法会抛出异常,异常中包括错误码、错误信息,详细请参看“SDK手册 > Java-SDK > 异常处理”,
链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response

OSS控制台可以直观的看到您调用OSS Java SDK的结果,OSS控制台地址是:https://oss.console.aliyun.com/index#/
OSS控制台使用方法请参看文档中心的“控制台用户指南”指南的链接地址是:

https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide
 
OSS的文档中心地址是:https://help.aliyun.com/document_detail/oss/user_guide/overview.html
OSS Java SDK的文档地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk
 
OSS开发过程中常见问题链接地址:https://help.aliyun.com/document_detail/32024.html?spm=5176.product31815.6.665.JuvIOS

开发环境:

开发工具:eclipse4.4+jdk7 均64位

OSS Java SDK依赖下列包:

  • aliyun-sdk-oss-2.2.1.jar
  • hamcrest-core-1.1.jar
  • jdom-1.1.jar
  • commons-codec-1.9.jar
  • httpclient-4.4.1.jar(重点)
  • commons-logging-1.2.jar
  • httpcore-4.4.1.jar(重点)
  • log4j-1.2.15.jar

其中,log4j-1.2.15.jar是可选的,需要日志功能的时加入该包。其它包都是必不可少的。

解决办法:您的工程中在加入OSS Java SDK依赖的包,加入方法如下:

  • 如果您的工程是Eclipse。请参考Java-SDK使用手册,”安装”-> “方式二:在Eclipse项目中导入工程依赖的包”;
  • 如果您的工程是maven。则直接添加依赖即可如:
  1. <dependency>
  2. <groupId>com.aliyun.oss</groupId>
  3. <artifactId>aliyun-sdk-oss</artifactId>
  4. <version>2.5.0</version>
  5. </dependency>

代码:

阿里云OSS对象存储常量:

  1. package com.qianjiang.util.aliyunoss;
  2.  
  3. /**
  4. * @class:OSSClientConstants
  5. * @descript:阿里云注册用户基本常量
  6. * @date:2017年3月16日 下午5:52:34
  7. * @author sang
  8. */
  9. public class OSSClientConstants {
  10. //阿里云API的外网域名
  11. public static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
  12. //阿里云API的密钥Access Key ID
  13. public static final String ACCESS_KEY_ID = "LTAIRGxaf6yoUsj0";
  14. //阿里云API的密钥Access Key Secret
  15. public static final String ACCESS_KEY_SECRET = "3gcfQkeWjaJ3tunuv4yyY4DStgpriz";
  16. //阿里云API的bucket名称
  17. public static final String BACKET_NAME = "uploadpicture";
  18. //阿里云API的文件夹名称
  19. public static final String FOLDER="somnus/";
  20.  
  21.  
  22. }

阿里云基本参数详解:

endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket,请在控制台上查看域名。
如果您还没有创建Bucket,endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”,
链接地址是:https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region
endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”,注意http://后不带bucket名称,
比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”,是错误的endpoint,请去掉其中的“bucket-name”。
    
accessKeyId和accessKeySecret是OSS的访问密钥,您可以在控制台上创建和查看,
创建和查看访问密钥的链接地址是:https://ak-console.aliyun.com/#/

注意:accessKeyId和accessKeySecret前后都没有空格,从控制台复制时请检查并去除多余的空格。
    
 Bucket用来管理所存储Object的存储空间,详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
 Bucket命名规范如下:只能包括小写字母,数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
    
 Object是OSS存储数据的基本单元,称为OSS的对象,也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
 Object命名规范如下:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
  就是上传文件名的名称,名称唯一 
    
 创建模拟文件夹
 OSS是没有文件夹这个概念的,所有元素都是以Object来存储。
 创建模拟文件夹本质上来说是创建了一个size为0的Object。
 对于这个Object可以上传下载,只是控制台会对以”/“结尾的Object以文件夹的方式展示。
 链接地址:https://help.aliyun.com/document_detail/32015.html?spm=5176.doc32013.2.5.ITwaY2

上传工具类:

  1. package com.qianjiang.util.aliyunoss;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.InputStream;
  7.  
  8. import org.apache.log4j.Logger;
  9.  
  10. import com.aliyun.oss.OSSClient;
  11. import com.aliyun.oss.model.Bucket;
  12. import com.aliyun.oss.model.OSSObject;
  13. import com.aliyun.oss.model.ObjectMetadata;
  14. import com.aliyun.oss.model.PutObjectResult;
  15.  
  16. /**
  17. * @class:AliyunOSSClientUtil
  18. * @descript:java使用阿里云OSS存储对象上传图片
  19. * @date:2017年3月16日 下午5:58:08
  20. * @author sang
  21. */
  22. public class AliyunOSSClientUtil {
  23. //log日志
  24. private static Logger logger = Logger.getLogger(AliyunOSSClientUtil.class);
  25. //阿里云API的内或外网域名
  26. private static String ENDPOINT;
  27. //阿里云API的密钥Access Key ID
  28. private static String ACCESS_KEY_ID;
  29. //阿里云API的密钥Access Key Secret
  30. private static String ACCESS_KEY_SECRET;
  31. //阿里云API的bucket名称
  32. private static String BACKET_NAME;
  33. //阿里云API的文件夹名称
  34. private static String FOLDER;
  35. //初始化属性
  36. static{
  37. ENDPOINT = OSSClientConstants.ENDPOINT;
  38. ACCESS_KEY_ID = OSSClientConstants.ACCESS_KEY_ID;
  39. ACCESS_KEY_SECRET = OSSClientConstants.ACCESS_KEY_SECRET;
  40. BACKET_NAME = OSSClientConstants.BACKET_NAME;
  41. FOLDER = OSSClientConstants.FOLDER;
  42. }
  43.  
  44. /**
  45. * 获取阿里云OSS客户端对象
  46. * @return ossClient
  47. */
  48. public static OSSClient getOSSClient(){
  49. return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);
  50. }
  51.  
  52. /**
  53. * 创建存储空间
  54. * @param ossClient OSS连接
  55. * @param bucketName 存储空间
  56. * @return
  57. */
  58. public static String createBucketName(OSSClient ossClient,String bucketName){
  59. //存储空间
  60. final String bucketNames=bucketName;
  61. if(!ossClient.doesBucketExist(bucketName)){
  62. //创建存储空间
  63. Bucket bucket=ossClient.createBucket(bucketName);
  64. logger.info("创建存储空间成功");
  65. return bucket.getName();
  66. }
  67. return bucketNames;
  68. }
  69.  
  70. /**
  71. * 删除存储空间buckName
  72. * @param ossClient oss对象
  73. * @param bucketName 存储空间
  74. */
  75. public static void deleteBucket(OSSClient ossClient, String bucketName){
  76. ossClient.deleteBucket(bucketName);
  77. logger.info("删除" + bucketName + "Bucket成功");
  78. }
  79.  
  80. /**
  81. * 创建模拟文件夹
  82. * @param ossClient oss连接
  83. * @param bucketName 存储空间
  84. * @param folder 模拟文件夹名如"qj_nanjing/"
  85. * @return 文件夹名
  86. */
  87. public static String createFolder(OSSClient ossClient,String bucketName,String folder){
  88. //文件夹名
  89. final String keySuffixWithSlash =folder;
  90. //判断文件夹是否存在,不存在则创建
  91. if(!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)){
  92. //创建文件夹
  93. ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
  94. logger.info("创建文件夹成功");
  95. //得到文件夹名
  96. OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
  97. String fileDir=object.getKey();
  98. return fileDir;
  99. }
  100. return keySuffixWithSlash;
  101. }
  102.  
  103. /**
  104. * 根据key删除OSS服务器上的文件
  105. * @param ossClient oss连接
  106. * @param bucketName 存储空间
  107. * @param folder 模拟文件夹名 如"qj_nanjing/"
  108. * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
  109. */
  110. public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key){
  111. ossClient.deleteObject(bucketName, folder + key);
  112. logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");
  113. }
  114.  
  115. /**
  116. * 上传图片至OSS
  117. * @param ossClient oss连接
  118. * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
  119. * @param bucketName 存储空间
  120. * @param folder 模拟文件夹名 如"qj_nanjing/"
  121. * @return String 返回的唯一MD5数字签名
  122. * */
  123. public static String uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String folder) {
  124. String resultStr = null;
  125. try {
  126. //以输入流的形式上传文件
  127. InputStream is = new FileInputStream(file);
  128. //文件名
  129. String fileName = file.getName();
  130. //文件大小
  131. Long fileSize = file.length();
  132. //创建上传Object的Metadata
  133. ObjectMetadata metadata = new ObjectMetadata();
  134. //上传的文件的长度
  135. metadata.setContentLength(is.available());
  136. //指定该Object被下载时的网页的缓存行为
  137. metadata.setCacheControl("no-cache");
  138. //指定该Object下设置Header
  139. metadata.setHeader("Pragma", "no-cache");
  140. //指定该Object被下载时的内容编码格式
  141. metadata.setContentEncoding("utf-8");
  142. //文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
  143. //如果没有扩展名则填默认值application/octet-stream
  144. metadata.setContentType(getContentType(fileName));
  145. //指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
  146. metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
  147. //上传文件 (上传文件流的形式)
  148. PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
  149. //解析结果
  150. resultStr = putResult.getETag();
  151. } catch (Exception e) {
  152. e.printStackTrace();
  153. logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
  154. }
  155. return resultStr;
  156. }
  157.  
  158. /**
  159. * 通过文件名判断并获取OSS服务文件上传时文件的contentType
  160. * @param fileName 文件名
  161. * @return 文件的contentType
  162. */
  163. public static String getContentType(String fileName){
  164. //文件的后缀名
  165. String fileExtension = fileName.substring(fileName.lastIndexOf("."));
  166. if(".bmp".equalsIgnoreCase(fileExtension)) {
  167. return "image/bmp";
  168. }
  169. if(".gif".equalsIgnoreCase(fileExtension)) {
  170. return "image/gif";
  171. }
  172. if(".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension) || ".png".equalsIgnoreCase(fileExtension) ) {
  173. return "image/jpeg";
  174. }
  175. if(".html".equalsIgnoreCase(fileExtension)) {
  176. return "text/html";
  177. }
  178. if(".txt".equalsIgnoreCase(fileExtension)) {
  179. return "text/plain";
  180. }
  181. if(".vsd".equalsIgnoreCase(fileExtension)) {
  182. return "application/vnd.visio";
  183. }
  184. if(".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
  185. return "application/vnd.ms-powerpoint";
  186. }
  187. if(".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
  188. return "application/msword";
  189. }
  190. if(".xml".equalsIgnoreCase(fileExtension)) {
  191. return "text/xml";
  192. }
  193. //默认返回类型
  194. return "image/jpeg";
  195. }
  196.  
  197. //测试
  198. public static void main(String[] args) {
  199. //初始化OSSClient
  200. OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();
  201. //上传文件
  202. String files="D:\\image\\1010.jpg,D:\\image\\1111.jpg,D:\\image\\1212.jpg,D:\\image\\1313.jpg,D:\\image\\2222.jpg,D:\\image\\3333.jpg,"
  203. + "D:\\image\\4444.jpg,D:\\image\\5555.jpg,D:\\image\\6666.jpg,D:\\image\\7777.jpg,D:\\image\\8888.jpg";
  204. String[] file=files.split(",");
  205. for(String filename:file){
  206. //System.out.println("filename:"+filename);
  207. File filess=new File(filename);
  208. String md5key = AliyunOSSClientUtil.uploadObject2OSS(ossClient, filess, BACKET_NAME, FOLDER);
  209. logger.info("上传后的文件MD5数字唯一签名:" + md5key);
  210. //上传后的文件MD5数字唯一签名:40F4131427068E08451D37F02021473A
  211. }
  212.  
  213.  
  214. }
  215.  
  216.  
  217. }

测试结果:

登录账户查看是否已经上传成功:

也可以下载OSS客户端查看:

客户端下载地址:http://download.csdn.net/detail/u014079773/9793762

登录客户端:

显示推荐内容

Java使用阿里云OSS对象存储上传图片的更多相关文章

  1. SpringBoot整合阿里云OSS对象存储实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...

  2. iOS使用阿里云OSS对象存储 (SDK 2.1.1)

    最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...

  3. C# .net Ueditor实现图片上传到阿里云OSS 对象存储

    在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...

  4. PHP 上传文件至阿里云OSS对象存储

    简述 1.阿里云开通对象存储服务 OSS 并创建Bucket 2.下载PHP SDK至框架扩展目录,点我下载 3.码上code 阿里云操作 开通对象存储服务 OSS 创建 Bucket 配置Acces ...

  5. 阿里云Oss对象存储

    将文件保存到阿里云上. 1.添加对象存储OSS空间 (新建Bucket) 可以在阿里云后台对象存储里面添加,也可以通过api添加.添加之后设置权限. skd使用. 1安装 Aliyun.OSS.SDK ...

  6. 阿里云OSS对象存储 简单上传文件

    不得不说阿里云的命名比较让人摸不着头脑,开始以为是文件存储NAS,弄了半天什么文件系统,挂载点的搞不明白.后来才搞清楚原来 对象存储OSS才是我需要的. 其中EndPoint就是画红框的部分,但是要加 ...

  7. 阿里云OSS对象存储服务(二)

    一.使用SDK 在OSS的概览页右下角找到"Bucket管理",点击"OSS学习路径" 点击"Java SDK"进入SDK开发文档 二.创建 ...

  8. 阿里云OSS对象存储服务(一)

    一.开通"对象存储OSS"服务 申请阿里云账号 实名认证 开通"对象存储OSS"服务 进入管理控制台 二.控制台使用 1.创建Bucket 命名:guli-fi ...

  9. 阿里云oss对象存储配置CDN

    阿里云oss对象存储配置CDN 1.打开阿里云CDN 2.填写信息,这个地方要注意,我的备案域名是www.ljwXXX.work,我们可以自定义一个域名,test.ljwXXX.work作为加速域名. ...

随机推荐

  1. jenkins-docker部署

    安装docker http://www.cnblogs.com/cjsblogs/p/8717304.html 安装jenkins mkdir -p /root/dockerfile/base/cen ...

  2. O021、创建 Image

    参考https://www.cnblogs.com/CloudMan6/p/5393376.html   本节演示如何通过 Web GUI 和 CLI 两种方法创建image.   OpenStack ...

  3. bzoj 3837 pa2013 Filary

    bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...

  4. String和StringBuffer的常见用法

    链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?answerType=1&f=dis ...

  5. Django 使用request获取浏览器发送的参数(Django编程-5)

    1.url:需要正则去匹配 url(r'^index/(num)/$',view.index) 匹配到的参数会自动传入对应的视图函数 也可以给匹配到的参数起名字?P url(r'^index/(?P& ...

  6. CVE-2018-0802漏洞利用

    看了一天apt报告,主流利用Office鱼叉攻击的漏洞,还是这Microsoft Office CVE-2017-8570,CVE-2017-11882和CVE-2018-0802 三个,而且都知道o ...

  7. aiomysql实现对数据库异步读取

    有一个库叫做aiomysql,这是一个基于asyncio和pymysql的库.至于为什么可以在tornado中使用,是因为高版本tornado的底层使用了asyncio. import asyncio ...

  8. plsql执行sql

    第一步找执行的命令:: plsql ::::::::::File----->>>>Change Windows to ------->>>Command Wi ...

  9. 【AGC010 C】Cleaning

    题意 有一棵 \(n\) 个点的树,第 \(i\) 个节点有 \(a_i\) 个石子. 每次都可以选择一对不同的叶子节点,这对叶子节点路径上的所有点都必须要有石子.然后去掉这两个叶子节点路径上的每个节 ...

  10. @Mapper和@Repository的区别

    参考博客地址 https://www.cnblogs.com/wangshen31/p/8735037.html 相同点 两个都是注解在Dao上 不同 @Repository需要在Spring中配置扫 ...