1.静态变量不可直接注入,可通过setter的方式注入,且setter方法不能为static,实际上是在静态变量被加载并默认初始化过后,初始化bean时被注入的
2.静态内部类可在bean被初始化之后再加载,从而实现利用外部类静态变量的目的3.变量的注入,需要注意变量名的统一
public class OssClient {
//log
private Logger logger = LoggerFactory.getLogger(this.getClass());
//阿里云API的内或外网域名
private static String END_POINT;
//阿里云API的密钥Access Key ID
private static String ACCESS_KEY_ID;
//阿里云API的密钥Access Key Secret
private static String ACCESS_KEY_SECRET;
//阿里云API的BUCKET_NAME
private static String BUCKET_NAME;
//静态内部类在上述bean的属性被初始化后再加载
public static class clientSingletonHolder{
//init on demand
static OSSClient client = new OSSClient(END_POINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);
}
// private static OSSClient client = new OSSClient(END_POINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);//会出现null错
/**
* 获取阿里云OSS客户端对象
* */
public OSSClient getOSSClient(){
return clientSingletonHolder.client;
}
/**
* 上传文件+参数为流
* @param bucketName
* @param fileName
* @param fileSuffix
* @param fileContent
* @param ossPath
* @return
* @throws IOException
*/
public void uploadFile(String bucketName, String fileName, String fileSuffix,
InputStream fileContent, String ossPath) throws IOException {
ObjectMetadata objectMetadata=new ObjectMetadata();
objectMetadata.setContentLength(fileContent.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(fileSuffix);
objectMetadata.setContentDisposition("inline;filename=" + fileName);
//上传文件,bucket名称 + 路径.文件名 + 文件流 + 对上传文件的描述
try {
getOSSClient().putObject(bucketName, ossPath.substring(1, ossPath.length())+fileName, fileContent, objectMetadata);
} catch(Exception ex) {
logger.error("上传文件异常!");
throw ex;
} finally {
//关闭流文件
FileUtils.close(fileContent);
}
}
/**
* 从OSS上获取下载流,并转成String格式输出
* @param bucketName
* @param detail
* @param ossPath
* @return
*/
public String downloadString(String bucketName, String detail, String ossPath) throws IOException {
OSSObject ossObject = null;
InputStream inputStream = null;
String key = ossPath + detail;
//去掉前面的"/"
key = key.substring(1, key.length());
//从oss上获取流
try {
ossObject = getOSSClient().getObject(BUCKET_NAME, key);
inputStream = ossObject.getObjectContent();
byte[] bytes = IOUtils.readStreamAsByteArray(inputStream);
//byte[]转String,编码
String stringDetail = new String(bytes, "UTF-8");
detail = stringDetail;
} catch (IOException e) {
logger.error("oss下载文件异常!");
e.printStackTrace();
} finally {
//关闭流文件
FileUtils.close(inputStream);
}
return detail;
}
public void downloadImage(String bucketName, String imageSrcPath, String fileName, String ossPath)
throws IOException {
OSSObject ossObject = null;
InputStream inputStream = null;
FileOutputStream output = null;
String key = ossPath + fileName;
key = key.substring(1, key.length());
//从OSS上获取文件
try {
ossObject = getOSSClient().getObject(bucketName, key);
inputStream = ossObject.getObjectContent();
byte[] bytes = IOUtils.readStreamAsByteArray(inputStream);
//创建目录和文件
File fileOss = new File(imageSrcPath);
if((!fileOss.isDirectory())) {
fileOss.mkdirs();
}
//fileName为1122.png.20160628201838,去掉后缀20160628201838
fileName = fileName.substring(0, fileName.lastIndexOf("."));
output = new FileOutputStream(imageSrcPath + fileName);
output.write(bytes);
} catch (IOException e) {
logger.error("oss下载文件异常!");
e.printStackTrace();
} finally {
//关闭流文件
FileUtils.close(output);
FileUtils.close(inputStream);
}
}
public String getBucketName() {
return BUCKET_NAME;
}
@Value("${BUCKET_NAME}")
public void setBucketName(String bucketName) {
BUCKET_NAME = bucketName;
}
public String getAccessKeySecret() {
return ACCESS_KEY_SECRET;
}
@Value("${ACCESS_KEY_SECRET}")
public void setAccessKeySecret(String accessKeySecret) {
ACCESS_KEY_SECRET = accessKeySecret;
}
public String getAccessKeyId() {
return ACCESS_KEY_ID;
}
@Value("${ACCESS_KEY_ID}")
public void setAccessKeyId(String accessKeyId) {
ACCESS_KEY_ID = accessKeyId;
}
public String getEndPoint() {
return END_POINT;
}
@Value("${END_POINT}")
public void setEndPoint(String endPoint) {
END_POINT = endPoint;
}
}