使用java开发阿里云OSS开放云存储服务

购买了阿里云后,我们发现一般ECS的存储空间都比较小,当然我们可以动态的扩展一些存储空间。但是作为开发者,我们在日常使用中需要一些更大的灵活性,因此就需要我们自己对OSS存储有一些自己的扩展。今天就为大家分享一下如何使用java来对接阿里云的OSS存储服务。

OSS产品概述

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 控制台对数据进行简单的管理。OSS 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。

开通阿里云OSS服务

首先要登录阿里云官网,然后选择产品——>存储于CDN——>对象存储 OSS。如下图:

然后我们可以根据自己的情况进行开通。开通完成后,我们就可以进入OSS控制台了。

OSS 控制台

OSS控制台布局包括bucket列表,bucket所在地域,创建时间和对于bucket操作。bucket这个概念用比较通俗的说法,就是用户创建的顶层目录,所有用户上传的文件都必须存在bucket下面,而且bucket在OSS系统中是不能重名的。如果已经有一个用户创建了bucket名称叫abc,那么很遗憾,您就不能创建一个名称叫abc的bucket了,每个用户可以创建10个bucket。注意红圈标注的ACCESSKEY管理按钮,点击后可以进行ACCESSKEY管理界面。

进入后点击显示,可以看到秘钥,AccesskeyId&AccessKeySecret 的使用方法请见OSS API文档
点击具体bucket,进入bucket 管理功能,包括bucket属性设置、object管理等。

创建Bucket

如果你还没有创建bucket,点击新建bucket。

进入新建Bucket页面,并填写Bucket信息

填写Bucket名称,选择所属地域,设置读写权限。 在填写完bucket信息后点击提交,创建bucket。

上传文件

点击红圈标注的上传文件,会弹出文件框列表,选择需要上传的文件进行上传。

分享文件

点击对应文件的获取地址,会弹出一个object 地址信息,其中地址链接可以是在公网访问到的。别人点击这个链接就可以下载到这个文件了,但是亲这可是要注意会产生流量费用的。

注意:如你的OSS Bucket未绑定域名,则你访问文件链接后默认为下载该文件,而不能直接浏览该文件。

java开发OSS存储服务

开通OSS服务器后,会有endpoint,跟地址;accessKeyId,类似用户名;accessKeySecret,类似密码;buketName:第一层文件夹的名字,一个用户可以创建十个bucketName,类似于我们的C,D,E,F盘符;accessUrl,很明显用户可以通过浏览器访问的地址。例如我们上传一个html文件,我们就可以通过"accessUrl/bucketName/目录/文件名.html,来进行访问。我在这里负责一个是页面静态化的功能,将动态的JSP页面生成静态的html页面,然后上传的OSS服务器,返回地址,让用户直接访问静态页面,这样就大大加快访问的速度。

OSS信息实体类,OSSConfigure.Java:

import java.io.IOException;
import java.util.Properties;

public class OSSConfigure {

	private String endpoint;
	private String accessKeyId;
	private String accessKeySecret;
	private String bucketName;
	private String accessUrl;

	public OSSConfigure() {

	}

	/**
	 * 通过配置文件.properties文件获取,这几项内容。
	 * @param storageConfName
	 * @throws IOException
	 */
	public OSSConfigure(String storageConfName) throws IOException {

		Properties prop = new Properties();
		prop.load(this.getClass().getClassLoader()
				.getResourceAsStream("conf/" + storageConfName));

		endpoint = prop.getProperty("endpoint").trim();
		accessKeyId = prop.getProperty("accessKeyId").trim();
		accessKeySecret = prop.getProperty("accessKeySecret").trim();
		bucketName = prop.getProperty("bucketName").trim();
		accessUrl = prop.getProperty("accessUrl").trim();

	}

	public OSSConfigure(String endpoint, String accessKeyId,
			String accessKeySecret, String bucketName, String accessUrl) {

		this.endpoint = endpoint;
		this.accessKeyId = accessKeyId;
		this.accessKeySecret = accessKeySecret;
		this.bucketName = bucketName;
		this.accessUrl = accessUrl;
	}

	public String getEndpoint() {
		return endpoint;
	}

	public void setEndpoint(String endpoint) {
		this.endpoint = endpoint;
	}

	public String getAccessKeyId() {
		return accessKeyId;
	}

	public void setAccessKeyId(String accessKeyId) {
		this.accessKeyId = accessKeyId;
	}

	public String getAccessKeySecret() {
		return accessKeySecret;
	}

	public void setAccessKeySecret(String accessKeySecret) {
		this.accessKeySecret = accessKeySecret;
	}

	public String getBucketName() {
		return bucketName;
	}

	public void setBucketName(String bucketName) {
		this.bucketName = bucketName;
	}

	public String getAccessUrl() {
		return accessUrl;
	}

	public void setAccessUrl(String accessUrl) {
		this.accessUrl = accessUrl;
	}

}

然后再创建一个工具类,这里需要提出的OSS服务器,上所有的都是对象,没有文件夹的概念,上传文件,直接写好路劲,他会自动创建。这里有一个入口OSSClient,很多方法都是通过它来实现的。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.springframework.web.multipart.MultipartFile;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.ObjectMetadata;

/**
 * 对OSS服务器进行上传删除等的处理
 *
 */
public class OSSManageUtil {
	/**
	 * 上传OSS服务器文件
	* @Title: uploadFile
	* @Description:
	* @param @param ossConfigure
	* @param @param file
	* @param @param remotePath
	* @param @return
	* @param @throws Exception    设定文件
	* @return String    返回类型
	* @throws
	 */
	public static String uploadFile(OSSConfigure ossConfigure,File file,String remotePath) throws Exception{
		InputStream fileContent=null;
		fileContent=new FileInputStream(file);

		OSSClient ossClient=new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(), ossConfigure.getAccessKeySecret());
		 String remoteFilePath = remotePath.substring(0, remotePath.length()).replaceAll("\\\\","/")+"/";
		//创建上传Object的Metadata
		ObjectMetadata objectMetadata=new ObjectMetadata();
		objectMetadata.setContentLength(fileContent.available());
		objectMetadata.setCacheControl("no-cache");
		objectMetadata.setHeader("Pragma", "no-cache");
		objectMetadata.setContentType(contentType(file.getName().substring(file.getName().lastIndexOf("."))));
		objectMetadata.setContentDisposition("inline;filename=" + file.getName());
		//上传文件
		ossClient.putObject(ossConfigure.getBucketName(), remoteFilePath + file.getName(), fileContent, objectMetadata);
		System.out.println(ossConfigure.getAccessUrl()+"/" +remoteFilePath + file.getName());
		return ossConfigure.getAccessUrl()+"/" +remoteFilePath + file.getName();
	}

	/**
	 * 根据key删除OSS服务器上的文件
	* @Title: deleteFile
	* @Description:
	* @param @param ossConfigure
	* @param @param filePath    设定文件
	* @return void    返回类型
	* @throws
	 */
	public static void deleteFile(OSSConfigure ossConfigure,String filePath){
		OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(),ossConfigure.getAccessKeyId(), ossConfigure.getAccessKeySecret());
		ossClient.deleteObject(ossConfigure.getBucketName(), filePath);

	}

   /**
     * Description: 判断OSS服务文件上传时文件的contentType
     * @Version1.0
     * @param FilenameExtension 文件后缀
     * @return String
     */
	 public static String contentType(String FilenameExtension){
		if(FilenameExtension.equals("BMP")||FilenameExtension.equals("bmp")){return "image/bmp";}
		if(FilenameExtension.equals("GIF")||FilenameExtension.equals("gif")){return "image/gif";}
		if(FilenameExtension.equals("JPEG")||FilenameExtension.equals("jpeg")||
		   FilenameExtension.equals("JPG")||FilenameExtension.equals("jpg")||
		   FilenameExtension.equals("PNG")||FilenameExtension.equals("png")){return "image/jpeg";}
		if(FilenameExtension.equals("HTML")||FilenameExtension.equals("html")){return "text/html";}
		if(FilenameExtension.equals("TXT")||FilenameExtension.equals("txt")){return "text/plain";}
		if(FilenameExtension.equals("VSD")||FilenameExtension.equals("vsd")){return "application/vnd.visio";}
		if(FilenameExtension.equals("PPTX")||FilenameExtension.equals("pptx")||
			FilenameExtension.equals("PPT")||FilenameExtension.equals("ppt")){return "application/vnd.ms-powerpoint";}
		if(FilenameExtension.equals("DOCX")||FilenameExtension.equals("docx")||
			FilenameExtension.equals("DOC")||FilenameExtension.equals("doc")){return "application/msword";}
		if(FilenameExtension.equals("XML")||FilenameExtension.equals("xml")){return "text/xml";}
		return "text/html";
	 }
}

好了,到这里OSS的简单开发就已经完成了。由于时间关系,我这里就写到这里,万事开头难,你对OSS有了简单的认识后。官网剩下的一堆api对你来说都是小菜。下面我在说一下在使用过程中遇到的问题和解决方案。

使用OSS存储服务遇到的问题和解决方案

ECS服务器被清洗

当服务器流量达到用户云盾设置的清洗阈值时,会自动进入流量清洗。
请注意,由于安全策略无法做到100%识别请求是否恶意,所以服务器被清洗后可能会有低概率的误杀存在,但绝大部分情况下正常请求不会受到影响,如果怀疑有误杀可提交工单由售后支持协助判断。

不同帐号下ECS服务器内网不通

默认情况下,不同帐号下的服务器内网是不通的。如果用户同时有多个帐号,并且多个帐号下都有服务器,那么这些服务器内网是不通的。如果需要不同帐号下内网互通,需要提交工单联系售后,阿里云售后工程师会协助打通内网。
请注意,需要内网打通的不同的帐号需要全部提交工单,说明哪些IP和哪些IP进行内网互通,或者帐号下所有服务器内网互通。并且在每一个工单中,都把已经提交的内网互通的工单号列出来(自身的工单号除外),以便阿里云售后工程师进行安全验证。

OSS内存泄漏

如果你遇到OSS内存泄漏问题,首先检查检查你的代码,肯定是某些该关闭IO流没有关闭。如果不能及时解决,可以提交工单,联系客服。

oss的callback返回的数据格式非JSON格式

可能是应用服务器处理过程中抛了异常,导致没有按照预期返回给OSS,而是返回了一些栈信息等,就可能会导致非JSON格式的数据产生。

OSS 返回的状态不为200

400或者其他的status比如404/403等是指应用服务器返回给oss的http是400或者404/403等,正常情况下应用服务器必须返回200给OSS。502是由于应用服务器根本就没有起web服务,没有监听OSS发过来的回调请求。

时间: 2024-12-02 16:41:52

使用java开发阿里云OSS开放云存储服务的相关文章

百度漫步“云”端   开放云构建健康产业生态圈

"云时代"到来,你是否跟上了"云"脚步?近几年,原先看起来似乎虚无飘渺.让人云里雾里的云计算扑面而来,越来越清晰,让人感到巨大的改变,云计算的好 处正在被越来越多的人所了解,而纵观国内互联网企业,百度等独具慧眼,有着强烈创新意识的公司也开始部署云计算.在今年的百度世界上,百度正式宣布开放云 计算平台,这也是继数据和应用开放平台后,百度首次开放原服务于内部产品的云计算,构建公共云计算服务平台.   将数据中心完全迁往"云"端并非易事  如何如破瓶颈

Hadoop社区支持阿里云OSS 云计算与开源融合的新里程碑

记者从全球著名的开源软件社区Hadoop社区获悉,Hadoop支持阿里云的OSS对象存储文件系统,这是Hadoop第一次支持中国云计算服务商的对象存储文件系统.这意味着全球用户在使用Hadoop这一开源软件时,都可以无缝连接阿里云的OSS对象存储文件系统.这是继Docker支持阿里云存储以后,又一个更重大的里程碑. OSS进入Hadoop社区后,意味着全球所有的Hadoop(HDFS)生态的离线,交互,数据仓库,深度学习等程序在不需要修改代码的情况下,自由读取和写入OSS对象存储,也提升了Had

Synology®新增支持阿里云OSS对象存储

群晖科技Synology与阿里云合作在群晖Cloud Sync套件新增支持阿里云OSS对象存储,让用户可以将NAS数据备份至阿里云OSS上,或是将阿里云OSS的数据存储到本地NAS,快速打造异地备份解决方案. 数据意外事故频传,无论是勒索病毒.天灾.硬件损坏或是人为误操作,都可能造成数据丢失或服务中断.根据国外机构IT Policy Compliance Group报告指出,全球每年有近百万的企业因为数据丢失而破产,平均每丢失一个客户记录就会造成100美元的损失.看准企业对数据保护的需求,群晖宣

携手英特尔,百度开放云将提供更强悍云服务

2016年4月1日,英特尔公司宣布推出多款致力于简化云计算部署和应用的创新产品,包括基于英特尔领先的14纳米制程技术的英特尔至强处理器E5-2600 v4产品家族以及两款采用NVMe*协议的英特尔数据中心固态盘P3320/P3520与D3700/D3600产品系列,旨在从计算.存储上实现更高的性能.灵活性和可用性,为云计算.技术计算.企业应用.存储以及网络等领域提供为软件定义优化的数据中心基础设施,帮助企业用户更快地运用云计算带来的优势,加速业务转型和基于云的服务的创新. 现场,来自百度开放云副

消除关键业务上云瓶颈,华为存储推进 “全面云化、闪存化”策略

随着云计算.大数据.物联网等IT技术的发展,企业的数据量急剧增长.企业数据存储服务如何才能变得更加高效?企业如何才能从复杂的数据存储管理中解放出来,专注于业务层面的变革创新?企业如何才能感受到云服务带来的便利,将关键业务安全无缝迁移到云端?--这一系列问题正困扰着企业CIO们. 为此,作为全球唯一拥有公有云业务的企业级存储设备供应商,华为提出了全面云化.全面闪存化的策略,推出了存储即服务的理念,为企业用户提供数据存储.数据保护等产品和解决方案. 消除关键业务上云瓶颈,推动企业存储服务全面云化转型

java操作阿里云的对象存储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&g

java 阿里云oss存储问题

问题描述 java 阿里云oss存储问题 最近项目需要把图片视频上传阿里云的oss,代码写完后测试,本地部署上传图片到oss完全没问题,但是部署到服务器上传图片页面就报504错误,oss我设置的timeout是50S,一张图片也就几十KB,不可能超时啊,所以我怀疑是其他什么原因,但是我想了一天,还是没个结果,所以在此求救大神帮助....在线等 解决方案 有大神愿意的话加QQ好友交流 解决方案二: 504是服务端错误 你的服务端代码出错了 解决方案三: 服务器错误 服务器环境和本地环境有区别 你再

国内首家 Docker新增支持阿里云OSS

近年来,开源的容器应用引擎Docker在企业IT市场中风生水起,短短两年内,建立在Docker容器软件内的应用被下载5.35亿次.全球约有400万人在使用Docker,约有150,000个在线应用靠Docker容器运行,大型企业正在空前快速地测试或计划采用Docker,胜过其他任何开源的云端产品. 8月12日,Docker1.8和Docker Registry 2.1发布,新版本中加入了Docker Registry对阿里云开放存储服务的正式支持,阿里云成为被Docker官方支持的存储服务的云服

Tachyon 已支持阿里云 OSS,正式改名 Alluxio

近日,人气很火的开源分布式虚拟存储系统 Tachyon 正式更名为 Alluxio,并发布了1.0版本.新的版本新增支持任意存储系统如阿里云对象存储 OSS.Amazon S3.OpenStack Swift 等. 据阿里云高级技术专家罗李介绍,阿里云为 Alluxio 社区提供了基于对象存储 OSS 的 UnderFileSystem 的支持,让存储在 Alluxio 内存文件系统中的数据可以使用 OSS 对象存储服务来作为持久化存储介质和数据交换平台. 此 前,Alluxio 用户遇到了无法