阿里云管理员账号看过来,阿里OSS为什么就没有备份成功过

对OSS存储服务的初步认识(上传,下载)
OSS存储服务
参考手机端:加入用户体验改进计划
实际就是抓取logcat[包括异常],通过该日志回传给开发者,参照用户使用日志对系统的作出有效的改进。
触发点:广播
该功能涉及到1.监听系统捕捉日志
2.把日志上传到服务器
具体做法:
【一】Oss的存储【IntentService】
准备:OSS SDK
提示:文中的ID指的是AccessKey ID,KEY指的是AccessKey Secret
1.解压后在libs目录下得到jar包,目前包括aliyun-oss-sdk-android-2.2.0.jar、okhttp-    
3.2.0.jar、okio-1.6.0.jar
2.将以上3个jar包导入工程的libs目录
3.引入lib后在
AndroidManifest.xml文件中配置这些权限
4.初始化OSSClient【来自SDK】
在IntentService中的onCreate()
初始化主要完成Endpoint设置、鉴权方式设置、Client参数设置。其中,鉴权方式包含明文设置模式、自签名模式、STS鉴权模式。鉴权细节详见后面的`访问控制`章节。
String endpoint = &https://oss-cn-hangzhou.aliyuncs.com&;
// 明文设置secret的方式建议只在测试时使用,更多鉴权模式请参考后面的`访问控制`章节
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(&&, &&);
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
以及需要创建断点记录文件夹
//断点数据保存的位置
Environment.getExternalStorageDirectory().getAbsolutePath() + &/oss_record/&;
File recordDir = new File(recordDirectory);
// 要保证目录存在,如果不存在则主动创建
if (!recordDir.exists()) {
recordDir.mkdirs();
5.初始化之后就可以通过OSS上传文件,这里上传采用的分片上传。也就是说在上传过程中如果遇到网络突然中断了,oss会作相对应的记录保存上传的进度。当下一次重新上传该文件的时候直接从上次保存的进度开始
在onHandleIntent(Intentintent)中除了接收intent传递过来的path外还需要判断断点记录,如果存在首先把上一次的上传完毕后再处理当前的
至于上传具体细节请看SDKorDEMO中
还需要在清单文件中:注册
说明: 为何采用IntentService【一般采用它来下载,上传也不例外啦】
    IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService。IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来处理所有Intent请求对象(通过startService的方式发送过来的)所对应的任务,这样以免事务处理阻塞主线程。执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则执行下一个Intent请求所对应的任务。
  IntentService在处理事务时,还是采用的Handler方式,创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所对应的子线程。ServiceHandler把处理一个intent所对应的事务都封装到叫做onHandleIntent的虚函数;因此我们直接实现虚函数onHandleIntent,再在里面根据Intent的不同进行不同的事务处理就可以了。
6.扩展模块就是文件的下载:
  由于实际开发中暂时不考虑该问题,所以该模块暂未实现.
  如有需求参考上传功能 ossSDK中也提供了该接口 :
  //创建保存的文件路径
finalFile f1 = new File(filepath + name);
if(!f1.exists()) {
f1.delete();
。。。。。。。。.
//初始化oss
  。。。。。。。。
//构造下载文件请求
GetObjectRequestget = new GetObjectRequest(&fly&,&yao/test.txt&);
OSSAsyncTasktask = oss.asyncGetObject(get, new    OSSCompletedCallback() {
publicvoid onSuccess(GetObjectRequest request, GetObjectResult result) {
//请求成功
//Log.d(&Content-Length&, && +getResult.getContentLength());
InputStreaminputStream = result.getObjectContent();
    //通过outputStream直接输出文件【保存到本地】
OutputStreamos =
   //byte[1024]这个长度主要看文件大小来定
byte[]buffer = new byte[1024];
os= new FileOutputStream(f1);
while((len = inputStream.read(buffer)) != -1) {
//处理下载的数据
os.write(buffer,0, len);
}catch (IOException e) {
e.printStackTrace();
if(inputStream!=null) {
inputStream.close();
}catch (IOException e) {
e.printStackTrace();
if(os!=null);
os.close();
}catch (IOException e) {
e.printStackTrace();
publicvoid onFailure(GetObjectRequest request, ClientExceptionclientExcepion, ServiceException serviceException) {
//请求异常
if(clientExcepion != null) {
//本地异常如网络异常等
clientExcepion.printStackTrace();
if(serviceException != null) {
//服务异常
Log.e(&ErrorCode&,serviceException.getErrorCode());
Log.e(&RequestId&,serviceException.getRequestId());
Log.e(&HostId&,serviceException.getHostId());
Log.e(&RawMessage&,serviceException.getRawMessage());
::其他的一些逻辑问题暂时不作判断。
【二】广播接收者
1.主要是接收处理logcat广播,启动服务。
2.注册:静态注册:需要实时等待接收广播
2.扩展模块:网络的监听,文件的监听
       网络监听:当没有网络的时候不开启服务,直接保存记录,发现有有网络的时候自动启动服务
       文件监听:监听本地断点文件记录有没有发生变化
【三】UI
   声明:(这个不是必须的)
   正常情况下个人认为在车机设置里添加
   这一项会比较人性化。
   应为考虑到上传可能需要使用用户的流量,在用户不知情下有必要提醒用户
   可以设置该功能默认是启动的。
   也就是说默认情况下是在监听用户使用情况。
   如果用户不开启该功能则不在上传日志文件。
                  
【oss附加功能】
1.在oss初始化化的时候还可以:
设置网络参数
也可以在初始化的时候设置详细的ClientConfiguration:
String endpoint = &https://oss-cn-hangzhou.aliyuncs.com&;// 明文设置secret的方式建议只在测试时使用,更多鉴权模式请参考后面的访问控制章节OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(&&, &&);
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
STS鉴权模式
OSS可以通过阿里云STS服务,临时进行授权访问。阿里云STS(Security Token Service) 是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或联邦用户(用户身份由您自己管理)颁发一个自定义时效和权限的访问凭证,App端称为FederationToken。第三方应用或联邦用户可以使用该访问凭证直接调用阿里云产品API,或者使用阿里云产品提供的SDK来访问云产品API。
您不需要透露您的长期密钥(AccessKey)给第三方应用,只需要生成一个访问令牌并将令牌交给第三方应用即可。这个令牌的访问权限及有效期限都可以由您自定义。
您不需要关心权限撤销问题,访问令牌过期后就自动失效。
以APP应用为例,交互流程如下图:
方案的详细描述如下:
App用户登录。App用户身份是客户自己管理。客户可以自定义身份管理系统,也可以使用外部Web账号或OpenID。对于每个有效的App用户来说,AppServer可以确切地定义出每个App用户的最小访问权限。
AppServer请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,AppServer需要确定App用户的最小访问权限(用Policy语法描述)以及授权的过期时间。然后通过调用STS的AssumeRole(扮演角色)接口来获取安全令牌。角色管理与使用相关内容请参考《RAM使用指南》中的。
STS返回给AppServer一个有效的访问凭证,App端称为FederationToken,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId,AccessKeySecret)以及过期时间。
AppServer将FederationToken返回给ClientApp。ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证。
ClientApp使用本地缓存的FederationToken去请求AliyunService API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,并正确响应用户请求。
【工作总结】
   从服务器上传下载文件这类型的开发,分2类把。
   第一类是第三方服务器【比如:阿里云,mbon等等】这些都有相对应的SDK 所有使用起来也挺方便 都为开发者提供了相对完整的框架 接口。开发者只需要申请对应的账号,获得相对应的key秘钥,把第三方的SDK引入到工程等,接着就是调用接口对的增删改查了
   第二类就是自己搭建的本地服务器
MainActivity:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); switchListener(); } /** * * 主要是对Switch控件的监听 * 事件的状态对应服务,广播的开启 * @author yao * @time 16-7-12 下午5:34 */ private void switchListener() { Switch aSwitch = (Switch) findViewById(R.id.switch1); aSwitch.setChecked(false); if (myApplication.SWITCH_ON.equals(SPUtils.readData(myApplication.SPUTILS_NAME,myApplication.SPUTILS_KEY))) { aSwitch.setChecked(true); } aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { Toast.makeText(MainActivity.this,myApplication.SWITCH_POINT, Toast.LENGTH_SHORT).show(); SPUtils.writeData(myApplication.SPUTILS_NAME,myApplication.SPUTILS_KEY, myApplication.SWITCH_ON); initReceiver(); } else { SPUtils.writeData(myApplication.SPUTILS_NAME,myApplication.SPUTILS_KEY, myApplication.SWITCH_OFF); destoryReceiver(); } } }); } /** *停止服务 * @author yao * @time 16-7-12 下午6:53 */ private void destoryReceiver() { Intent mintent = new Intent(); mintent.setAction(&fly.upload.logcat.isok&); sendBroadcast(mintent); } /** *启动广播【开机状态】【触发事件】 * @author yao * @time 16-7-12 下午5:37 * 需要传递文件路径 才能上传服务器 */ private void initReceiver() { Log.d(&123321&, &initReceiver: 启动广播&); Intent intent = new Intent(); intent.putExtra(&path&, &null&); intent.setAction(&fly.upload.logcat&); this.sendBroadcast(intent); }
public void onReceive(Context context, Intent intent) {
Intent mintent = new Intent(context, myService.class);
if ((&ON&.equals(SPUtils.readData(&CONFIG&,&LOGIN&)))&&intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
//开机启动服务
mintent.putExtra(&path&, &&);
context.startService(mintent);
if ((&ON&.equals(SPUtils.readData(&CONFIG&,&LOGIN&)))&&intent.getAction().equals(&fly.upload.logcat&)) {
String path = intent.getExtras().getString(&path&);
if (!path.equals(&null&)) {
mintent.putExtra(&path&, path);
context.startService(mintent);
public class myService extends IntentService{
private OSS
private String recordD
public myService() {super(&myService&);}
public IBinder onBind(Intent intent) {return super.onBind(intent);}
//初始化oss工作
public void onCreate() {init();super.onCreate();}
* 注意点:
* 这里采用明文模式
* 实际中不可以采用
private void init() {
String endpoint = &https://oss-cn-shanghai.aliyuncs.com&;
// 明文设置AccessKeyId/AccessKeySecret的方式建议只在测试时使用
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(&jSSSSS65SSSSS51&, &SSSSDADASDSDSDSDASDDt&);
oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
//断点数据保存的位置
recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + &/oss_record/&;
File recordDir = new File(recordDirectory);
// 要保证目录存在,如果不存在则主动创建
if (!recordDir.exists()) {
recordDir.mkdirs();
protected void onHandleIntent(Intent intent) {
//Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
action = intent.getExtras().getString(&path&);
String s = SPUtils.readData(&PATH&, &OLD&);
//判断上一次是否存在没有上传完毕的数据,如果存在着首先上传,否则直接上传本次数据
if (!&&.equals(s)) {
upLoad(s);
upLoad(action);
//上传服务
private void upLoad(final String path) {
// 创建断点上传请求,参数中给出断点记录文件的保存位置,需是一个文件夹的绝对路径 具体看sdk
ResumableUploadRequest request = new ResumableUploadRequest(&fly&, &fly/&+path, path, recordDirectory);
// 设置上传过程回调
request.setProgressCallback(new OSSProgressCallback() {
public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
//因为没有涉及到ui 这里不处理
Log.d(&123321&, &onProgress: &+currentSize);
OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback() {
public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {
//成功后重置记录
if (path.equals(SPUtils.readData(&PATH&, &OLD&))) {
Intent mintent = new Intent();
mintent.setAction(&fly.upload.logcat&);
mintent.putExtra(&path&, action);
sendBroadcast(mintent);
SPUtils.writeData(&PATH&, &OLD&, &&);
public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 请求异常
if (clientExcepion != null) {
// 本地异常如网络异常等
clientExcepion.printStackTrace();
if (serviceException != null) {
// 服务异常
Log.e(&ErrorCode&, serviceException.getErrorCode());
Log.e(&RequestId&, serviceException.getRequestId());
Log.e(&HostId&, serviceException.getHostId());
Log.e(&RawMessage&, serviceException.getRawMessage());
//失败后保存摘要,等待下次开机上传
SPUtils.writeData(&PATH&, &OLD&, path);
public void onDestroy() {
recordDirectory =
super.onDestroy();
工具类:(需要的可以复制保存哦)
public class SPUtils {
/** 上下文 */
public static C
public static void setContext(Context context) {
SPUtils.context =
* 写入首选项文件(.xml)
* @param filename
* @param key
* @param value
public static void writeData(String filename,String key,String value){
//实例化SharedPreferences对象,参数1是存储文件的名称,参数2是文件的打开方式,当文件不存在时,直接创建,如果存在,则直接使用
SharedPreferences mySharePreferences =
context.getSharedPreferences(filename, Context.MODE_PRIVATE);
//实例化SharedPreferences.Editor对象
SharedPreferences.Editor editor =mySharePreferences.edit();
//用putString的方法保存数据
editor.putString(key, value);
//提交数据
editor.commit();
* 从首选项中读取值
* @param filename
* @param key
public static String readData(String filename,String key){
//实例化SharedPreferences对象
SharedPreferences mySharePerferences =
context.getSharedPreferences(filename, Context.MODE_PRIVATE);
//用getString获取值
String name =mySharePerferences.getString(key, &&);
* 获取全部的键值对
* @param filename
public static Map getAll(String filename)
SharedPreferences sp =
context.getSharedPreferences(filename,Context.MODE_PRIVATE);
return sp.getAll();
* 查询某个key是否已经存在
* @param filename
* @param key
public static boolean contains(String filename, String key)
SharedPreferences sp =
context.getSharedPreferences(filename,Context.MODE_PRIVATE);
return sp.contains(key);
* 移除某个值
* @param filename
* @param key
public static void remove(String filename, String key)
SharedPreferences sp = context.getSharedPreferences(filename,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.commit();
APPLICATION:
public class myApplication extends Application {
public static final String SWITCH_ON = &ON&;
public static final String SWITCH_OFF = &OFF&;
public static final String SPUTILS_NAME = &CONFIG&;
public static final String SPUTILS_KEY = &LOGIN&;
public static final String SWITCH_POINT = &感谢&;
//文件路径名称
private final String LOGCAT_DIR = &logcat_flyaudio&;
//内置路径
private final String PATH_HOME = &/storage/emulated/0&;
//外置路径
private final String PATH_OTHER = &/storage/sdcard1&;*/
//内置SDcard卡的路径
public static final String SDCARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath()
public void onCreate() {
super.onCreate();
SPUtils.setContext(this);
清单文件:备份与恢复,解除后顾之忧 | 就要阿里云
当前位置:
备份与恢复,解除后顾之忧
对业务系统来说,数据可靠性非常重要。如何通过简单的配置,实现适当有效的备份机制并具备快速恢复能力是本最佳实践所要解决的主要问题。
不同的业务系统,对可用性和备份恢复的要求有很大的不同:
对一般系统来说,因为阿里云默认有3份冗余副本、对磁盘和数据库的每天自动备份,并承诺99.9%的可用性,所以不须做更多配置。但为了应对意外情况,需要做好变更日志和本地备份。
对业务价值比较大的系统来说,只要做到严格遵守操作规范和利用阿里云提供高可用、数据备份和恢复机制,无论发生何种类型的故障或灾难,也能降低损失,从容应对。
对业务价值特别重大的系统来说,需要考虑异地容灾和建立灾难恢复计划,并定期演练。
阿里云提供的存储类型有:云磁盘、本地磁盘、RDS、OSS和OTS等共5种类型。除了默认的3份存储冗余外,为保证数据的高可靠性,还提供了快照和DB实例等形式的备份恢复机制。简要介绍如下:
默认频率/期限
每天/最近三天
(主从RAID10)
每天/最近三天
底层是阿里云自主研发的高可用分布式文件系统,系统默认数据保存三份,存储于集群内的各物理机上。
快照为增量方式,支持API调用备份。快照存储于OSS中。
默认系统快照生成的时间是每天凌晨,并保留3天。
回滚时间取决于快照的数据量和快照数量,通常是分钟级别。
主从热备部署方式,支持机房内、跨机房和跨地域三种部署方式,后两种部署方式可靠性更好。
RDS实例的备份存储在OSS上,支持自动备份和API方式备份。
默认备份策略是每天进行实例备份,并保留7天。默认备份时间是随机时间,用户需要根据自己的业务特点进行设定。
支持异地和不同实例间回滚。
回滚时间取决于实例的备份次数和数据库大小,与在同配置物理机上新建完全相同的库性能相当。
OSS存储可能位于多个机房,但一个bucket只位于一个机房(三份冗余存储)。
机房内的存储方式与云磁盘相同。
本文以某个有代表性的网站为例来阐明基于阿里云平台的备份与恢复的最佳实践。该网站的系统架构包含负载均衡、CDN、Web Server、缓存Server、数据库系统、文件服务器等。架构示意图如下所示:
该网站直接使用了阿里云的SLB、CDN、RDS和OSS标准产品,并使用ECS搭建Web Server和Cache Server。制定备份策略的主要步骤如下:
Step 1:明确业务涉及到的数据类型,例如该网站的数据类型描述如下:
固定数据指的是操作系统和通用软件。本例中是Web应用系统及其依赖的第三方组件等。
包含用户在阿里云的配置数据和业务系统自身的配置数据,系统需要这些配置数据才能正常运转。这些数据不是临时性的,但也能通过人工或程序自动(API调用)重新配置。本例中是软件配置(Web应用系统等)和在云产品(SLB、CDN、RDS和OSS)上的配置。
临时文件、静态文件缓存或其它数据,完全丢失它们,不会影响系统的正常运行。因此,不需要备份它们。本例中是Cache Server上缓存的数据。
持久化数据
这些数据表示了业务的状态,其中包含重要的客户数据。如账号信息和订单信息。这些数据通常存储在数据库中,最终保存在硬盘、SSD等块设备上。数据备份复杂性和难点在这部分数据上。本例中是RDS和OSS中存储的数据。
Step2:根据数据类型制定备份策略,例如对该网站可制定如下策略:
推荐存储类型
建议备份策略
云磁盘(系统盘)
操作系统或应用系统升级后,或配置数据更改后,手动制作快照。
内存或本地磁盘
不需要备份。
持久化数据
云磁盘(数据盘)
直接使用默认备份或按1~24小时频率通过API方式备份。
简要说明如下:
系统盘只存储操作系统和各种软件及其配置;数据盘只存储持久化的业务系统的文件。另外,考虑数据可靠性和性能,推荐使用RDS服务,而不是在云磁盘上自建数据库。
因为固定数据和配置数据可以方便地重建,所以此处把它们归类为同类数据。软件升级或配置更新后,进行适当的备份是为了能够快速恢复。
为避免自然灾害等不可抗力对快照和实例备份的可能损坏,可以按天或按周进行异地/本地备份。
最后,业务方自身也要有严格的系统变更控制流程,并做好变更日志,以规避人为因素引起的故障。
阿里云管理控制台提供创建快照及自定义镜像、备份实例等功能,用户也可通过API来操作。详细请参见相关帮助。
仍以该网站为例,考虑故障/灾难情形下的应对措施,主要包括确定恢复类型、制定相应恢复策略两部分。
建议恢复策略
小批量物理机
无须人工参与,自动迁移,迁移时长在10~15分钟之间。
地域性灾难
等待故障恢复;
或在阿里云其它可用地域重新申请云产品。
固定/配置数据
从最近的可用快照/自定义镜像恢复;
或从本地备份恢复;
或从标准镜像重建,并重新配置(依据变更日志)。
持久性数据
从可用快照/实例备份恢复;
或从本地备份恢复。
简要说明如下:
利用云监控的站点可用性和服务器监控,能够及时发现故障,更早触发恢复过程。
数据恢复策略可从以下几个方面来综合考虑。
恢复数据库(RDS):通过OSS或本地存储的RDS实例备份来恢复。
快速恢复应用服务器(ECS)、云磁盘:通过自定义镜像重装系统或快照回滚来恢复。
恢复负载均衡(SLB):更改配置,指向新的应用服务器IP地址。
恢复/更改DNS:指向新的负载均衡接口IP地址。
阿里云服务器迅速部署网站
; 知识库:;;;
点击下图去购买阿里云服务器啦
热门日志热点评论随机日志
日志总数:456 篇
评论总数:338 篇
标签数量:419 个
链接总数:14 个
运行天数:1731 天
最后更新:阿里云OSS&用来备份超大文件
限制单个文件最大上限5G,当超过5G时需要用分块上传。本质上OSS是阿里的盘古文件系统,类似HDFS,默认是3个备份,正常不会发生数据丢失。
package oss_
import java.io.F
import java.io.FileInputS
import java.util.ArrayL
import java.util.L
import com.aliyun.openservices.oss.OSSC
com.aliyun.openservices.oss.model.CompleteMultipartUploadR
com.aliyun.openservices.oss.model.CompleteMultipartUploadR
com.aliyun.openservices.oss.model.InitiateMultipartUploadR
com.aliyun.openservices.oss.model.InitiateMultipartUploadR
import com.aliyun.openservices.oss.model.PartET
com.aliyun.openservices.oss.model.UploadPartR
com.aliyun.openservices.oss.model.UploadPartR
public class Oss_mulitpart_msg {
& & private static final
String ACCESS_ID = " ";
& & private static final
String ACCESS_KEY = " ";
& & private static final
String endpoint = "";
& & private static final
String bucketName=" ";
& & public static void
main(String[] args) throws Exception {
if (args.length != 2) {
System.exit(-1);
String oss_file_name = args[0];
String local_file &= args[1];
OSSClient client = new OSSClient(endpoint,ACCESS_ID,
ACCESS_KEY);
InitiateMultipartUploadRequest initiateMultipartUploadRequest
= new InitiateMultipartUploadRequest(bucketName,
oss_file_name);
InitiateMultipartUploadResult initiateMultipartUploadResult =
client.initiateMultipartUpload(initiateMultipartUploadRequest);
// 打印UploadId
System.out.println("UploadId: " +
initiateMultipartUploadResult.getUploadId());
final long partSize = 2L;
&System.out.println(partSize);
File partFile = new File(local_file);
System.out.println(partFile.length());
// 计算分块数目
int partCount = (int) (partFile.length() / partSize);
if (partFile.length() % partSize != 0){
& &partCount++;
// 新建一个List保存每个分块上传后的ETag和PartNumber
List partETags = new ArrayList();
for(int i = 0; i & partC i++){
& &// 获取文件流
& &FileInputStream fis = new
FileInputStream(partFile);
& &// 跳到每个分块的开头
& &long skipBytes = partSize
&fis.skip(skipBytes);
& &// 计算每个分块的大小
& &long size = partSize &
partFile.length() - skipBytes ?
& & &partSize :
partFile.length() - skipB
创建UploadPartRequest,上传分块
& &UploadPartRequest
uploadPartRequest = new UploadPartRequest();
&uploadPartRequest.setBucketName(bucketName);
&uploadPartRequest.setKey(oss_file_name);
&uploadPartRequest.setUploadId(initiateMultipartUploadResult.getUploadId());
&uploadPartRequest.setInputStream(fis);
&uploadPartRequest.setPartSize(size);
&uploadPartRequest.setPartNumber(i + 1);
& &UploadPartResult
uploadPartResult = client.uploadPart(uploadPartRequest);
将返回的PartETag保存到List中。
&partETags.add(uploadPartResult.getPartETag());
& &// 关闭文件
& &fis.close();
&System.out.println(i);
CompleteMultipartUploadRequest completeMultipartUploadRequest
&new CompleteMultipartUploadRequest(bucketName,
oss_file_name, initiateMultipartUploadResult.getUploadId(),
partETags);
// 完成分块上传
CompleteMultipartUploadResult completeMultipartUploadResult
&client.completeMultipartUpload(completeMultipartUploadRequest);
// 打印Object的ETag
System.out.println(completeMultipartUploadResult.getETag());
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 阿里云邮箱管理员 的文章

 

随机推荐