本文为使用OSS对象存储小结,无广告之嫌。
相关技术文档链接:https://help.aliyun.com/document_detail/31955.html?spm=a2c4g.11186623.6.1002.44bf6212HiMG95
一.创建javaOSS上传工具类
需要导入的jar包在网站有,需要注意的是,httpclient.jar和httpcore.jar的版本需要保持一致,不然会上传出错。slf4j.jar 系列的也需要保持一致,上代码。
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import org.apache.log4j.Logger;
/**
*
* @ClassName: OSSUpload
* @Description: OSS文件上传工具类
* @author shadow
* @date 2018年8月16日 上午10:04:38
*/
public class OSSUpload {
static Logger logger = Logger.getLogger(OSSUpload.class);
// 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”。
//如果使用是阿里云服务器,则可以使用 oss-cn-xxxxxxx-internal.aliyuncs.com 进行内网上传
//private static String endpoint = "oss-cn-xxxxxxx-internal.aliyuncs.com";
private static String endpoint = "oss-cn-xxxxxxx.aliyuncs.com";
// accessKeyId和accessKeySecret是OSS的访问密钥,您可以在控制台上创建和查看,
// 创建和查看访问密钥的链接地址是:https://ak-console.aliyun.com/#/。
// 注意:accessKeyId和accessKeySecret前后都没有空格,从控制台复制时请检查并去除多余的空格。
private static String accessKeyId = "你的keyId";
private static String accessKeySecret = "你的KeySecret";
// Bucket用来管理所存储Object的存储空间,详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
// Bucket命名规范如下:只能包括小写字母,数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
private static String bucketName = "你的bucketName";
/**
*
* @Title: putObjectByByte
* @Description: 上传文件
* @param @param filePath 文件路径,需要创建次级目录直接拼接,OSS会根据路径自动创建 ,如 aaa/bbb/ccc.jpg
* 如果不存在aaa或bbb则OSS会自动创建.命名规范如下:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
* @param @param data byte[] 文件byte流
* @param @return 设定文件
* @return boolean 返回类型
* @throws
*/
public static void putObjectByByte(String filePath,byte[] data) {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, filePath, new ByteArrayInputStream(data));
ossClient.shutdown();
}
/**
*
* @Title: deleteObject
* @Description: 删除文件
* @param @param filePath 文件路径
* @return void 返回类型
* @throws
*/
public static void deleteObject(String filePath) {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ossClient.deleteObject(bucketName, filePath);
ossClient.shutdown();
}
/**
*
* @Title: putObjectByInputStream
* @Description: 上传文件
* @param @param filePath
* @param @param inputStream 文件流
* @return void 返回类型
* @throws
*/
public static void putObjectByInputStream(String filePath,InputStream inputStream) {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, filePath, inputStream);
ossClient.shutdown();
}
/**
*
* @Title: putObjectByFile
* @Description: 上传文件
* @param @param filePath
* @param @param file 本地文件
* @return void 返回类型
* @throws
*/
public static void putObjectByFile(String filePath,File file) {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, filePath, file);
ossClient.shutdown();
}
/**
*
* @Title: downloadObjectToStringBuilder
* @Description: 下载文件-流式下载
* @param @param filePath
* @param @return 设定文件
* @return StringBuilder 返回类型
* @throws
*/
public static StringBuilder downloadObjectToStringBuilder(String filePath) {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
StringBuilder objectContent = null;
try {
OSSObject ossObject = ossClient.getObject(bucketName, filePath);
InputStream inputStream = ossObject.getObjectContent();
objectContent = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
String line = reader.readLine();
if (line == null)
break;
objectContent.append(line);
}
inputStream.close();
} catch (OSSException oe) {
oe.printStackTrace();
} catch (ClientException ce) {
ce.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
ossClient.shutdown();
}
return objectContent;
}
/**
*
* @Title: downloadObjectToFile
* @Description: 下载文件到本地
* @param @param ossFilePath oss上的文件路径
* @param @param newFilePath 本地文件路径
* @return void 返回类型
* @throws
*/
public static void downloadObjectToFile(String ossFilePath,String newFilePath) {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(newFilePath));
ossClient.shutdown();
}
}
如果不关掉apache.http日志的debug打印,每次上传都会打印出二进制字符串,非常多,非常耗日志存储,也影响调试。在日志配置文件中添加 ,将打印等级变成INFO即可。
<logger name="org.apache.http" level="INFO"/>