aliyun-OSS断点续传
阿里云OSS断点续传(Java版本)
在工作中发现开发的某项功能在用户网络环境差的时候部分图片无法显示,通过Review代码之后发现原来是图片上传到了国外的亚马逊服务器上,经过讨论决定将图片上传到国内阿里云的OSS上,下面是通过上网查找资料和看官网API之后写的一个Java版本的断点续传的demo。
注意:这里是上传到你自己的服务器后,然后再上传到阿里云OSS,不是直接通过前端上传的
首先 , 添加maven
<!-- 阿里云OSS服务 -->
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.3.0</version>
</dependency>
根据官网断点续传写demo
阿里云官网:https://help.aliyun.com/document_detail/31886.html?spm=a2c4g.11186623.6.564.52d735542GHP78
import java.util.Properties;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.UploadFileRequest;
import com.tinno.gamecenter.biz.util.PropertiesHelper;
import com.tinno.gamecenter.common.beans.OssUploadBean;
import com.tinno.gamecenter.core.exception.TinnoCommonException;
/**
* 阿里云文件存储服务器相关
* @Title: OssUtil.java
* @author 王武明
* @date 2018年9月18日 下午1:50:01
* @version V1.0
*/
public class OssUtil
{
/**
* 日志
*/
private static Logger logger = Logger.getLogger(OssUtil.class);
// 阿里云API的内或外网域名
private static String ALIYUN_OSS_ENDPOINT;
// 阿里云API的密钥Access Key ID
private static String ALIYUN_ACCESS_KEY_ID;
// 阿里云API的密钥Access Key Secret
private static String ALIYUN_OSS_ACCESS_KEY_SECRET;
// bucket
private static String ALIYUN_OSS_BUCKET_ID;
static
{
Properties properties = PropertiesHelper.loadPropertiesFile("/config.properties");
ALIYUN_OSS_ENDPOINT = properties.containsKey("ALIYUN_OSS_ENDPOINT") == false ? "" : PropertiesHelper.getString("ALIYUN_OSS_ENDPOINT", null, properties);
ALIYUN_ACCESS_KEY_ID = properties.containsKey("ALIYUN_ACCESS_KEY_ID") == false ? "" : PropertiesHelper.getString("ALIYUN_ACCESS_KEY_ID", null, properties);
ALIYUN_OSS_ACCESS_KEY_SECRET = properties.containsKey("ALIYUN_OSS_ACCESS_KEY_SECRET") == false ? ""
: PropertiesHelper.getString("ALIYUN_OSS_ACCESS_KEY_SECRET", null, properties);
ALIYUN_OSS_BUCKET_ID = properties.containsKey("ALIYUN_OSS_BUCKET_ID") == false ? "" : PropertiesHelper.getString("ALIYUN_OSS_BUCKET_ID", null, properties);
}
/**
* 获取阿里云OSS客户端对象
* @return OSSClient 返回类型
*/
@SuppressWarnings("deprecation")
public static final OSSClient getOSSClient()
{
return new OSSClient(ALIYUN_OSS_ENDPOINT, ALIYUN_ACCESS_KEY_ID, ALIYUN_OSS_ACCESS_KEY_SECRET);
}
/**
* 新建Bucket --Bucket权限:私有
* @param bucketName bucket名称
* @return true 新建Bucket成功
*/
public static final boolean createBucket(OSSClient client)
{
Bucket bucket = client.createBucket(ALIYUN_OSS_BUCKET_ID);
return ALIYUN_OSS_BUCKET_ID.equals(bucket.getName());
}
/**
* 删除Bucket
* @param bucketName bucket名称
*/
public static final void deleteBucket(OSSClient client, String bucketName)
{
client.deleteBucket(bucketName);
logger.error("删除" + bucketName + "Bucket成功");
}
/**
* 通过文件名判断并获取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))
return "image/jpeg";
if (".jpg".equalsIgnoreCase(fileExtension))
return "image/jpg";
if (".png".equalsIgnoreCase(fileExtension))
return "image/png";
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";
}
/**
* 向阿里云的OSS存储中存储文件
* @author 王武明
* @date 2018年9月18日 下午4:00:22
* @param client OSS客户端
* @param file 上传文件
* @param bucketName bucket名称
* @param diskName 上传文件的目录 --bucket下文件的路径
* @return String 唯一MD5数字签名
* @throws TinnoCommonException
* @return String 返回类型
*/
public static final String uploadObject2OSS(OssUploadBean ossUploadBean) throws TinnoCommonException
{
OSSClient ossClient = ossUploadBean.getOssClient();
String fileName = ossUploadBean.getFileName();
String localePath = ossUploadBean.getLocalePath();
String checkpointFile = ossUploadBean.getCheckpointFile();
String key = ossUploadBean.getKey();
Callback callback = ossUploadBean.getCallback();
try
{
UploadFileRequest uploadFileRequest = new UploadFileRequest(ALIYUN_OSS_BUCKET_ID, key);
// 指定上传的内容类型
ObjectMetadata metadata = new ObjectMetadata();
metadata.setCacheControl("no-cache");
metadata.setHeader("Pragma", "no-cache");
metadata.setContentEncoding("utf-8");
metadata.setContentType(getContentType(fileName));
// 设置存储空间名称
uploadFileRequest.setBucketName(ALIYUN_OSS_BUCKET_ID);
// 设置文件名称。
//uploadFileRequest.setKey("<yourObjectName>");
// 指定上传的本地文件。
uploadFileRequest.setUploadFile(localePath);
// 指定上传并发线程数,默认为1。
uploadFileRequest.setTaskNum(5);
// 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
uploadFileRequest.setPartSize(1 * 1024 * 1024);
// 开启断点续传,默认关闭。
uploadFileRequest.setEnableCheckpoint(true);
// 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数,上传过程中的进度信息会保存在该文件中,
// 如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。
// 上传完成后,该文件会被删除。默认与待上传的本地文件同目录,为uploadFile.ucp。
if (StringUtils.isEmpty(checkpointFile))
{
uploadFileRequest.setCheckpointFile("uploadFile.ucp");
}else {
uploadFileRequest.setCheckpointFile(checkpointFile);
}
// 文件的元数据。
uploadFileRequest.setObjectMetadata(metadata);
// 设置上传成功回调,参数为Callback类型。
if (callback != null)
{
uploadFileRequest.setCallback(callback);
}
// 断点续传上传。
try
{
ossClient.uploadFile(uploadFileRequest);
}
catch (Throwable e)
{
e.printStackTrace();
}
}
catch (Exception e)
{
logger.error("上传阿里云OSS文件服务器出错!", e);
throw new TinnoCommonException("上传阿里云OSS文件服务器出错!", e);
}
finally
{
ossClient.shutdown();
}
return String.format("https://%s.%s/%s", ALIYUN_OSS_BUCKET_ID,ALIYUN_OSS_ENDPOINT,key);
}
}
JavaBean, 这里面用来lombok插件,所以无需手动设置set和get
import java.io.File;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.Callback;
import lombok.Data;
@Data
public class OssUploadBean
{
/**
* 阿里云Oss上传客户端
*/
private OSSClient ossClient;
/**
* 需要上传文件到的某一个桶
*/
private Bucket bucket;
/**
* 回调参数
* 设置文档:https://help.aliyun.com/document_detail/31989.html
*/
private Callback callback;
/**
* 需要上传的文件
*/
private File file;
/**
* 文件名称
*/
private String fileName;
/**
* 文件所在的本地路径
*/
private String localePath;
/**
* 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数,上传过程中的进度信息会保存在该文件中,
* 如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。
* 上传完成后,该文件会被删除。默认与待上传的本地文件同目录,为uploadFile.ucp。
*/
private String checkpointFile;
/**
* 上传到某一个bucket文件夹下
*/
private String key;
}
config.properties相关配置
#OSS
ALIYUN_OSS_ENDPOINT=oss-cn-beijing.aliyuncs.com
ALIYUN_ACCESS_KEY_ID=<your aliyun access key id>
ALIYUN_OSS_ACCESS_KEY_SECRET=<your access key secret>
ALIYUN_OSS_BUCKET_ID=<your bucket id>
实际使用Test Method
//上传文件到阿里云OSS服务器
private String uploadOSS(String fileName, String localePath) throws TinnoCommonException
{
try
{
OSSClient ossClient = OssUtil.getOSSClient();
OssUploadBean ossUploadBean = new OssUploadBean();
// 文件名称
ossUploadBean.setFileName(fileName);
// 文件上传到自己的服务器的地址
ossUploadBean.setLocalePath(localePath);
ossUploadBean.setOssClient(ossClient);
ossUploadBean.setKey(String.format("%s/%s","folder",fileName));//上传到bucket下的某一个路径
// 返回上传到的oss路径
return OssUtil.uploadObject2OSS(ossUploadBean);
}
catch (Exception e)
{
logger.error("上传阿里云服务器出错!", e);
throw new TinnoCommonException("上传阿里云服务器出错!", e);
}
}
编写代码时候遇到的一些问题
1. 设置callback:因为这里我不需要callback所以没有引入callback,这里附上官网设置callback的链接:
https://help.aliyun.com/document_detail/31989.html
2. 上传文件后如何访问:代码在上面,这里附上官网链接:
https://help.aliyun.com/knowledge_detail/39607.html
aliyun-OSS断点续传的更多相关文章
- Aliyun Oss 上传文件
目录 Aliyun OSS OSS 简介 OSS 基本概念 OSS 功能概述 OSS 使用 创建存储空间Bucket 创建子目录 Java编码 测试 Aliyun OSS OSS 简介 阿里云对象存储 ...
- Windows下编译使用Aliyun OSS PHP SDK
摘要: WIN环境下搭建Aliyun OSS PHP SDK编译运行环境.从PHP的安装逐步完成,SDK的编译运行.即使没有任何PHP基础,也能顺利完成. 安装环境:Win7 64 + PHP 5.6 ...
- Aliyun OSS SDK 异步分块上传导致应用异常退出
问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...
- aliyun oss操作汇总
// endpoint以杭州为例,其它region请按实际情况填写 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; ...
- com.aliyun.oss.ClientException: Connection error due to: Connection pool shut down
com.aliyun.oss.ClientException: Connection error due to: Connection pool shut down[ErrorCode]: Unkno ...
- Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)
1.此文章主要介绍内容 本文主要介绍如何利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将所有访问本地Ngin ...
- aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决
upload ClientException Read timed out com.aliyun.openservices.ClientException: Read timed out ...
- python3.3.5x64+win2003x64+aliyun oss sdk安装步骤
参考文章:https://help.aliyun.com/document_detail/32026.html?spm=5176.doc31890.6.690.S6ZrRn 1.安装python3.3 ...
- oss2模块和aliyun oss链接
安装oss pip install oss2 首先已经理解OSS 基本概念,如Bucket.Object.Endpoint.AccessKeyId和AccessKeySecret等. 下面介绍如何使用 ...
- 前端直传文件到aliyun OSS
<template> <div id="container"> <div class="img-item m-1 upload-file&q ...
随机推荐
- 算法问题实战策略 FENCE
地址 https://algospot.com/judge/problem/read/FENCE 开始考虑暴力遍历 #include <iostream> #include <str ...
- Python进阶小结
目录 一.异常TODO 二.深浅拷贝 2.1 拷贝 2.2 浅拷贝 2.3 深拷贝 三.数据类型内置方法 3.1 数字类型内置方法 3.1.1 整型 3.1.2 浮点型 3.2 字符串类型内置方法 3 ...
- 杂牌机搞机之旅最终章————刷入Xposed框架
杂牌机搞机之旅最终章----刷入Xposed框架 recovery移植不成功,没办法,挂载分区好像挂载不上,所以,刷入magisk如果卡在开机屏,只能线刷解决..心累.. 所以,折腾完XPosed框架 ...
- Gallery -- 横向不断滚动 demo
<%@ Page Language="C#" AutoEventWireup="true" %> <!DOCTYPE html> < ...
- SSM(七)在JavaWeb应用中使用Redis
前言 先来看一张效果图: 作用就是在每次查询接口的时候首先判断Redis中是否有缓存,有的话就读取,没有就查询数据库并保存到Redis中,下次再查询的话就会直接从缓存中读取了.Redis中的结果:之后 ...
- git登陆
git登陆 1. 执行登陆用户名和密码命令 git config --global user.email "you@example.com" git config --global ...
- Python入门36道经典练习题
[程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? num_list=[] cou=0 for i in range(1,5): for j in rang ...
- 通过SSH通道来访问MySQL
许多时候当要使用Mysql时,会遇到如下情况: 1. 信息比较重要,希望通信被加密.2. 一些端口,比如3306端口,被路由器禁用. 对第一个问题的一个比较直接的解决办法就是更改mysql的代码,或 ...
- javafx笔记----非javafx线程Platform.runLater赋值不生效情况
Platform.runLater(() -> { // }); Platform.runLater一些情况下没有赋值到fx页面上 采用task方式 Task<SB> task = ...
- 炫彩字and鼠标爱心
<!DOCTYPE html> <style type="text/css"> body{ background-color: black; } #zx { ...