package cn.com.ctop.common.utils; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.Bucket; import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @Configuration @PropertySource("classpath:config.properties") public class OSSUtils { private static Logger logger = LoggerFactory.getLogger(OSSUtils.class); /** * 阿里云API的密钥Access Key ID */ private static String accessKeyId; /** * 阿里云API的密钥Access Key Secret */ private static String accessKeySecret; /** * 阿里云API的内或外网域名 */ private static String endpoint; /** * 阿里云API的bucket名称 */ private static String bucketName; /** * 阿里云API的文件夹名称 */ private static String folder; /** * 获取阿里云OSS客户端对象 * * @return ossClient */ public static OSSClient getOSSClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 创建存储空间 * * @param ossClient OSS连接 * @param bucketName 存储空间 * @return */ public static String createBucketName(OSSClient ossClient, String bucketName) { // 存储空间 final String bucketNames = bucketName; if (!ossClient.doesBucketExist(bucketName)) { // 创建存储空间 Bucket bucket = ossClient.createBucket(bucketName); logger.info("创建存储空间成功"); return bucket.getName(); } return bucketNames; } /** * 删除存储空间buckName * * @param ossClient oss对象 * @param bucketName 存储空间 */ public static void deleteBucket(OSSClient ossClient, String bucketName) { ossClient.deleteBucket(bucketName); logger.info("删除" + bucketName + "Bucket成功"); } /** * 创建模拟文件夹 * * @param ossClient oss连接 * @param bucketName 存储空间 * @param folder 模拟文件夹名如"qj_nanjing/" * @return 文件夹名 */ public static String createFolder(OSSClient ossClient, String bucketName, String folder) { // 文件夹名 final String keySuffixWithSlash = folder; // 判断文件夹是否存在,不存在则创建 if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { // 创建文件夹 ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); logger.info("创建文件夹成功"); // 得到文件夹名 OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); String fileDir = object.getKey(); return fileDir; } return keySuffixWithSlash; } /** * 根据key删除OSS服务器上的文件 * * @param ossClient oss连接 * @param bucketName 存储空间 * @param folder 模拟文件夹名 如"qj_nanjing/" * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg" */ public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key) { ossClient.deleteObject(bucketName, folder + key); logger.info("删除" + bucketName + "下的文件" + folder + key + "成功"); } /** * 上传图片至OSS * * @param ossClient oss连接 * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg) * @param bucketName 存储空间 * @param folder 模拟文件夹名 如"qj_nanjing/" * @return String 返回的唯一MD5数字签名 */ public static String uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String folder) { String resultStr = null; try { // 以输入流的形式上传文件 InputStream is = new FileInputStream(file); // 文件名 String fileName = file.getName(); // 文件大小 Long fileSize = file.length(); // 创建上传Object的Metadata ObjectMetadata metadata = new ObjectMetadata(); // 上传的文件的长度 metadata.setContentLength(is.available()); // 指定该Object被下载时的网页的缓存行为 metadata.setCacheControl("no-cache"); // 指定该Object下设置Header metadata.setHeader("Pragma", "no-cache"); // 指定该Object被下载时的内容编码格式 metadata.setContentEncoding("utf-8"); // 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成, // 如果没有扩展名则填默认值application/octet-stream metadata.setContentType(getContentType(fileName)); // 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称) metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte."); // 上传文件 (上传文件流的形式) PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata); // 解析结果 resultStr = putResult.getETag(); } catch (Exception e) { e.printStackTrace(); logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e); } return resultStr; } /** * 通过文件名判断并获取OSS服务文件上传时文件的contentType * * @param fileName 文件名 * @return 文件的contentType */ public static 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) || ".jpg".equalsIgnoreCase(fileExtension) || ".png".equalsIgnoreCase(fileExtension)) { return "image/jpeg"; } 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 ""; } @Value("${aliyun.accessKeyId}") public void setAccessKeyId(String accessKeyId) { OSSUtils.accessKeyId = accessKeyId; } @Value("${aliyun.accessKeySecret}") public void setAccessKeySecret(String accessKeySecret) { OSSUtils.accessKeySecret = accessKeySecret; } @Value("${aliyun.oss.endpoint}") public void setEndpoint(String endpoint) { OSSUtils.endpoint = endpoint; } @Value("${aliyun.oss.bucketName}") public void setBucketName(String bucketName) { OSSUtils.bucketName = bucketName; } @Value("${aliyun.oss.folder}") public void setFolder(String folder) { OSSUtils.folder = folder; } }