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. 删除链表中重复的结点——牛客剑指offer

    题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...

  2. 分布式---Paxos算法

    5.Paxos   Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.一个典型的场景就是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最 ...

  3. C# 如何正确删除控件已添加的事件

    方法一:在相对应里窗体下面有个 "窗体.Designer.cs"文件,双击打开,找到相关事件,删除就行. 方法二:找到构造函数,“InitializeComponent()”对着它 ...

  4. markdown图片转换demo

    markdown图片转换demo 一直以来都是用Markdown来写博客的,但是它的图片嵌入实在是太让人头秃,逼得我能找网上的图片就不用自己的,实在是麻烦.所以我在发现了一个可以生成markdown样 ...

  5. loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...

  6. performance面板使用,以及解决动画卡顿

    https://googlechrome.github.io/devtools-samples/jank//    官方案例 https://juejin.im/post/5b65105f518825 ...

  7. 两个实体类 复制 copy 工具类

    import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; public class ...

  8. shell 里面的计算

    ---恢复内容开始--- 关于shell里面的计算其实早在接触LINUX的时候就已经接触到了.每次在运用的时候却是在网上到处找,所以觉得花点时间好好研究下. 首先了解下常用的算数运算符号: +  - ...

  9. 配置jupyter notebook网页浏览

    上一篇博文已经介绍安装了Anaconda3:https://www.cnblogs.com/hello-wei/p/10233192.html jupyter notebook [I 11:33:11 ...

  10. windows环境变量和相关命令操作

    1.很多程序在windows上运行都需要设置环境变量. 2.具体步骤 复制路径 打开系统设置 高级系统设置 环境变量 设置path 重启cmd 3.可以把路径设置成变量,这样就不用随时 改path而是 ...