/**
* OSS文件上传
* @author songhj
*
*/
public class OSSClientUtil {
/**
* 日志
*/
private static final Logger SYS_JOB_LOGGER = LoggerFactory.getLogger("sys-job");
/**
* 外网域名
*/
private String endpoint;
/**
* 密钥Access Key ID
*/
private String accessKeyId;
/**
* 密钥Access Key Secret
*/
private String accessKeySecret;
/**
* bucket名称
*/
private String bucketName;
/**
* 文件夹名称
*/
private String path;
/**
* OSS对象
*/
private OSSClient ossClient;
/**
* 初始化
* 获取阿里云OSS客户端对象
*/
public OSSClientUtil() {
endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
accessKeyId = "LTA********vyAQw";
accessKeySecret = "6u2aCxq************PjBtvz2XwZi";
bucketName = "sz-tst";
path = "upload/" + CommUtil.formatTime("yyyyMM", new Date()) + "/";
ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
}
/**
* 本地图片上传处理
* @param file
* @return
*/
public InterfaceVo uploadImgOss(MultipartFile file) {
InterfaceVo vo = new InterfaceVo();
if (file.getSize() > 2 * 1024 * 1024) {
vo.setCodeEnum(-1, "上传图片大小不能超过2M!");
return vo;
}
Accessory accessory = new Accessory();
String originalFilename = file.getOriginalFilename();
String ext = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
String name = CommUtil.randomString(18);
try {
/**
* 验证是否存在
*/
while(true){
boolean isObjectExist = ossClient.doesObjectExist(bucketName, path + name + ext);
if(isObjectExist){
name = CommUtil.randomString(18);
}else{
break;
}
}
InputStream inputStream = file.getInputStream();
String key = uploadFileOSS(inputStream, name + ext);
if(CommUtil.isNotNull(key)){
accessory.setPath("/" + path);
accessory.setName(name);
accessory.setExt(ext);
BufferedImage bis = ImageIO.read(inputStream);
if(bis != null){
accessory.setWidth(bis.getWidth());
accessory.setHeight(bis.getHeight());
}
accessory.setSize(file.getSize());
accessory.setCreateTime(new Date());
vo.setCodeEnum(Code.SUCCESS);
vo.getOutData().put("obj", accessory);
SYS_JOB_LOGGER.info("=======上传图片成功:" + path + name + ext);
//关闭
ossClient.shutdown();
}
} catch (Exception e) {
SYS_JOB_LOGGER.error("========上传图片失败:" + e.getMessage());
vo.setCodeEnum(-1, "图片上传失败");
}
return vo;
}
/**
* 上传图片到阿里云OSS
* @param instream
* @param fileName
* @return
*/
public String uploadFileOSS(InputStream instream, String fileName) {
String ret = "";
try {
//创建上传Object的Metadata
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(instream.available());
metadata.setCacheControl("no-cache");
metadata.setHeader("Pragma", "no-cache");
metadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
metadata.setContentDisposition("inline;filename=" + fileName);
//上传文件
PutObjectResult putResult = ossClient.putObject(bucketName, path + fileName, instream, metadata);
ret = putResult.getETag();
} catch (IOException e) {
SYS_JOB_LOGGER.error(e.getMessage(), e);
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
/**
* 判断OSS服务文件上传时文件的contentType
* @param FilenameExtension
* @return
*/
public static String getcontentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase("bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase("gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase("jpeg") ||
FilenameExtension.equalsIgnoreCase("jpg") ||
FilenameExtension.equalsIgnoreCase("png")) {
return "image/jpeg";
}
if (FilenameExtension.equalsIgnoreCase("html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase("txt")) {
return "text/plain";
}
if (FilenameExtension.equalsIgnoreCase("vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase("pptx") ||
FilenameExtension.equalsIgnoreCase("ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase("docx") ||
FilenameExtension.equalsIgnoreCase("doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase("xml")) {
return "text/xml";
}
return "image/jpeg";
}
/**
* 创建文件夹
* 要创建的文件夹名称,在满足Object命名规则的情况下以"/"结尾 ,例如:images/
* @param client
*/
public void createFolder(String folderName) {
/**
* 这里的size为0,注意OSS本身没有文件夹的概念,这里创建的文件夹本质上是一个size为0的Object,dataStream仍然可以有数据
* 照样可以上传下载,只是控制台会对以"/"结尾的Object以文件夹的方式展示,用户可以利用这种方式来实现文件夹模拟功能,创建形式上的文件夹
*/
ObjectMetadata objectMeta = new ObjectMetadata();
byte[] buffer = new byte[0];
ByteArrayInputStream in = new ByteArrayInputStream(buffer);
objectMeta.setContentLength(0);
ossClient.putObject(bucketName, folderName, in, objectMeta);
}
/**
* 删除文件
* @param fileName
*/
public void deleteObject(String fileName) {
boolean isObjectExist = ossClient.doesObjectExist(bucketName, fileName);
if (isObjectExist) {
SYS_JOB_LOGGER.info("====文件存在,可以删除");
ossClient.deleteObject(bucketName, fileName);
} else {
SYS_JOB_LOGGER.info("====文件不存在,无法删除!");
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
//初始化OSSClient
// OSSClientUtil oSSClientUtil = new OSSClientUtil();
// oSSClientUtil.deleteObject("cps/upload/");
// oSSClientUtil.shutdown();
}
}
/**
* 图片信息
* @author songhj
*
*/
public class Accessory {
/**
* 附件名称
*/
private String name;
/**
* 附件路径
*/
private String path;
/**
* 附件大小
*/
private float size;
/**
* 附件扩展名
*/
private String ext;
/**
* 时间
*/
private Date createTime;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public float getSize() {
return size;
}
public void setSize(float size) {
this.size = size;
}
public String getExt() {
return ext;
}
public void setExt(String ext) {
this.ext = ext;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}