java操作阿里云的对象存储OSS

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 官网:: 对象存储(Object Storage Service,简称OSS) 以下博客简单介绍连接阿里云的OSS,新建Bucket,删除Bucket,向阿里云的OSS存储中存储单个文件,获取单个文件,删除单个文件等功能。 Api:: 开放式存储(OSS)Java API手册 1.0 documentation 以下为pom依赖: <!-- aliyun oss --

官网:: 对象存储(Object Storage Service,简称OSS)

以下博客简单介绍连接阿里云的OSS,新建Bucket,删除Bucket,向阿里云的OSS存储中存储单个文件,获取单个文件,删除单个文件等功能。

Api:: 开放式存储(OSS)Java API手册 1.0 documentation

以下为pom依赖:

		<!-- aliyun oss -->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>2.2.1</version>
		</dependency>

下载地址: Aliyun OSS SDK For Java » 2.2.1

下边为oss的配置文件oss.properties,也可以直接写入代码:

endpoint=oss-cn-beijing.aliyuncs.com
accessKeyId=您的key
accessKeySecret=您的secret

注endpoint为:OSS外网域名或OSS内网域名去掉您的Bucket.后

OSS的操作代码:

package my.demo.java.z.aliyun.oss;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;

public class OSSUnit {
	
	//log
	private static final Logger LOG = LoggerFactory.getLogger(OSSUnit.class);
	
	//阿里云API的内或外网域名
	private static String ENDPOINT;
	//阿里云API的密钥Access Key ID
	private static String ACCESS_KEY_ID;
	//阿里云API的密钥Access Key Secret
	private static String ACCESS_KEY_SECRET;
	
	//init static datas
	static{
		ResourceBundle bundle = PropertyResourceBundle.getBundle("properties.oss");
		ENDPOINT = bundle.containsKey("endpoint") == false ? "" : bundle.getString("endpoint");
		ACCESS_KEY_ID = bundle.containsKey("accessKeyId") == false? "" : bundle.getString("accessKeyId");
		ACCESS_KEY_SECRET = bundle.containsKey("accessKeySecret") == false ? "" : bundle.getString("accessKeySecret");
	}
	
	/**
	 * 获取阿里云OSS客户端对象
	 * */
	public static final OSSClient getOSSClient(){
		return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);
	}
	
	/**
	 * 新建Bucket  --Bucket权限:私有
	 * @param bucketName bucket名称
	 * @return true 新建Bucket成功
	 * */
	public static final boolean createBucket(OSSClient client, String bucketName){
		Bucket bucket = client.createBucket(bucketName); 
		return bucketName.equals(bucket.getName());
	}
	
	/**
	 * 删除Bucket 
	 * @param bucketName bucket名称
	 * */
	public static final void deleteBucket(OSSClient client, String bucketName){
		client.deleteBucket(bucketName); 
		LOG.info("删除" + bucketName + "Bucket成功");
	}
	
	/**
	 * 向阿里云的OSS存储中存储文件  --file也可以用InputStream替代
	 * @param client OSS客户端
	 * @param file 上传文件
	 * @param bucketName bucket名称
	 * @param diskName 上传文件的目录  --bucket下文件的路径
	 * @return String 唯一MD5数字签名
	 * */
	public static final String uploadObject2OSS(OSSClient client, File file, String bucketName, String diskName) {
		String resultStr = null;
		try {
			InputStream is = new FileInputStream(file);
			String fileName = file.getName();
			Long fileSize = file.length();
			//创建上传Object的Metadata
			ObjectMetadata metadata = new ObjectMetadata();
			metadata.setContentLength(is.available());
			metadata.setCacheControl("no-cache");
			metadata.setHeader("Pragma", "no-cache");
			metadata.setContentEncoding("utf-8");
			metadata.setContentType(getContentType(fileName));
			metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
			//上传文件 
			PutObjectResult putResult = client.putObject(bucketName, diskName + fileName, is, metadata);
			//解析结果
			resultStr = putResult.getETag();
		} catch (Exception e) {
			LOG.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
		}
		return resultStr;
	}
	
    /** 
     * 根据key获取OSS服务器上的文件输入流
 	 * @param client OSS客户端
 	 * @param bucketName bucket名称
 	 * @param diskName 文件路径
 	 * @param key Bucket下的文件的路径名+文件名
     */  
     public static final InputStream getOSS2InputStream(OSSClient client, String bucketName, String diskName, String key){ 
		OSSObject ossObj = client.getObject(bucketName, diskName + key);
		return ossObj.getObjectContent();	
     }  
	
   /** 
    * 根据key删除OSS服务器上的文件 
  	* @param client OSS客户端
  	* @param bucketName bucket名称
  	* @param diskName 文件路径
  	* @param key Bucket下的文件的路径名+文件名
    */  
	  public static void deleteFile(OSSClient client, String bucketName, String diskName, String key){  
	  	client.deleteObject(bucketName, diskName + key); 
	  	LOG.info("删除" + bucketName + "下的文件" + diskName + key + "成功");
	  }  
     
    /** 
     * 通过文件名判断并获取OSS服务文件上传时文件的contentType 
     * @param fileName 文件名
     * @return 文件的contentType   
     */  
     public static final String getContentType(String fileName){  
    	String fileExtension = fileName.substring(fileName.lastIndexOf("."));
    	if("bmp".equalsIgnoreCase(fileExtension)) return "image/bmp";
    	if("gif".equalsIgnoreCase(fileExtension)) return "image/gif";
    	if("jpeg".equalsIgnoreCase(fileExtension) || "jpg".equalsIgnoreCase(fileExtension)  || "png".equalsIgnoreCase(fileExtension) ) return "image/jpeg";
    	if("html".equalsIgnoreCase(fileExtension)) return "text/html";
    	if("txt".equalsIgnoreCase(fileExtension)) return "text/plain";
    	if("vsd".equalsIgnoreCase(fileExtension)) return "application/vnd.visio";
    	if("ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) return "application/vnd.ms-powerpoint";
    	if("doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) return "application/msword";
    	if("xml".equalsIgnoreCase(fileExtension)) return "text/xml";
        return "text/html";  
     }  

}

代码对应测试代码junit如下:

package my.demo.java.z.aliyun.oss;

import static org.junit.Assert.assertEquals;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aliyun.oss.OSSClient;

public class OSSUnitTest {
	
	//log
	private static final Logger LOG = LoggerFactory.getLogger(OSSUnitTest.class);
	
	private OSSUnit ossunit = null;
	private OSSClient client = null;
	private String bucketName = "oss-test-my";
	@Before
	public void initUnit(){
		ossunit = new OSSUnit();
		client = OSSUnit.getOSSClient();
	}

	@Test
	public void testCreateBucket() {
		String bucketName = "oss-test-my";
		//创建bucket
		assertEquals(true, OSSUnit.createBucket(client, bucketName));
	}
	
	@Test
	public void testDeleteBucket(){
		String bucketName = "oss-test-my";
		//删除bucket
		OSSUnit.deleteBucket(client, bucketName);
		//console log :删除oss-test-myBucket成功
	}
	
	@Test
	public void testUploadObject2OSS(){
		//上传文件
		String flilePathName = "C:/Users/Tony_tian/Desktop/csdnimg/preossimg.jpg";
		File file = new File(flilePathName);
		String diskName = "datas/image/";
		String md5key = OSSUnit.uploadObject2OSS(client, file, bucketName, diskName);
		LOG.info("上传后的文件MD5数字唯一签名:" + md5key);  //上传后的文件MD5数字唯一签名:A30B046A34EB326C4A3BBD784333B017
	}
	
	@Test
	public void testGetOSS2InputStream(){
		//获取文件
		try {
			BufferedInputStream bis = new BufferedInputStream(OSSUnit.getOSS2InputStream(client, bucketName, "datas/image/", "preossimg.jpg"));
			String resfile = "C:/Users/Tony_tian/Desktop/csdnimg/preossimg_res.jpg";
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(resfile)));
			int itemp = 0;
			while((itemp = bis.read()) != -1){
				bos.write(itemp);
			}
			LOG.info("文件获取成功"); //console log :文件获取成功
			bis.close();
			bos.close();
		} catch (Exception e) {
			LOG.error("从OSS获取文件失败:" + e.getMessage(), e);
		}
	}
	
	@Test
	public void testDeleteFile(){
		//注:文件夹下只有一个文件,则文件夹也会一起删除;如果多个文件,只会删除指定文件名的文件
		//删除文件
		OSSUnit.deleteFile(client, bucketName, "datas/image/", "preossimg.jpg");
		//console log : 删除oss-test-my下的文件datas/image/preossimg.jpg成功
	}

}
部分效果图:

新建Bucket(Bucket权限:私有,公开需手动设置)前后和删除Bucket:




上传文件前后即删除文件:

注:文件夹下只有一个文件,则文件夹也会一起删除;如果多个文件,只会删除指定文件名的文件




上边记录为私有文件的获取,如果要获取“Bucket权限:公共读”的就很简单了:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Aliyun-OSS</title>
		<meta name="keywords" content="Aliyun-OSS"/>
		<meta name="description" content="Aliyun-OSS" />
	<!--	<link rel="stylesheet" href="${serverprc }/static/css/common.css" />
		<script type="text/javascript" src="${serverprc }/static/js/common.js" charset="utf-8"></script> -->
	</head>
	<body>
		<div>
			Bucket权限:公共读的图片:<img src="http://tsxs-datas.oss-cn-beijing.aliyuncs.com/image/public/tsxs_title_logo.ico"/>
		</div>
	</body>
</html>
打开效果:


相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
机器学习/深度学习 编解码 人工智能
阿里云Stable Diffusion操作教程
阿里云Stable Diffusion操作教程
197 0
|
1月前
|
Java API 开发工具
如何用阿里云 oss 下载文件
阿里云对象存储服务(OSS)提供了多种方式下载文件,以下讲解下各种方式的下载方法
845 1
|
1月前
|
存储 安全 对象存储
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
本文详细介绍了怎样帮助新手小白从注册,购买阿里云OSS,到一步一步配置OSS做为图床,和PicGo、Typora软件连接,配置好关联之后,在使用Typora写文章时,如果需要插入图片,只需要将图片复制粘贴到Typora的编辑区域,就会自动通过PicGo上传到指定图床,自动复制外网能访问的URL并展示,简直不要太方便,极大的解决了编辑文章时复制处理图片链接的痛点。
171 2
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
2天前
|
存储 开发工具 对象存储
Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
9 0
|
9天前
|
存储 Java API
阿里云oss简介和使用流程
本文档介绍了如何准备阿里云OSS(对象存储服务)并开始使用它。首先,需要注册阿里云账号并进行实名认证,然后购买OSS资源包。在阿里云控制台中,可以创建和管理OSS存储空间(称为“Bucket”)。接着,文章简要介绍了阿里云OSS,它是一个基于云端的对象存储服务,提供高可靠性、高性能、低成本和易于使用的特性。 在阿里云OSS控制台,用户可以进行文件的上传和下载操作。通过API,开发者可以使用各种编程语言(如Java)来创建、删除Bucket以及上传、下载和删除文件。例如,Java代码示例展示了如何创建Bucket、上传文件、删除文件以及下载文件到本地的操作。
|
16天前
|
开发工具 对象存储
阿里云OSS文件上传
阿里云OSS文件上传
57 0
|
16天前
|
存储 缓存 Java
阿里云OSS实战从入门到大神
说起阿里云OSS,那作用和功能都是非常强大的,它可以存放图片,音频,视频等资源文件,这些资源文件,你不必存放到服务器的硬盘里,这样既可以节省服务器硬盘空间,又可以降低服务器的读写压力,非常适合大并发的架构。
55 0
|
23天前
|
消息中间件 NoSQL Kafka
云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操作
该方案描述了一个大数据ETL流程,其中阿里云Kafka消息根据内容触发函数计算(FC)函数,执行针对MongoDB的增、删、改操作。
|
28天前
|
存储 对象存储 容器
阿里云OSS对象存储基础入门
阿里云OSS对象存储基础入门
90 0