接上一个文章讲解还有一个东西忘记说
AccessKey 这玩意用来搞认证的 差不多
开通就好了…等会要用到
步入正题创建oss模块也就是一个项目
导入依赖
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!-- 上传文件依赖组件 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- aliyun oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.7.RELEASE</version> <scope>test</scope> </dependency> </dependencies> <repositories> <repository> <id>aliyun</id> <name>aliyun Repository</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
创建OSSUploadUtil.java
package top.yangbuyi.utils; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSSClient; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.*; import top.yangbuyi.utils.config.OSSConfig; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * @description: 杨不易网站:www.yby6.com * @program: yangbuyispringcloudparent * @ClassName: OSSUtils * @create: 2020-08-11 23:09 * @author: yangbuyi * @since: JDK1.8 * @OSSUploadUtil: 阿里云OSS文件上传工具类 **/ public class OSSUploadUtil { private static OSSConfig config = null; /** * * @MethodName: uploadFile * @Description: OSS单文件上传 * @param file * @param fileType 文件后缀 * @return String 文件地址 */ public static String uploadFile(File file, String fileType){ config = config==null?new OSSConfig():config; String fileName = config.getPicLocation()+ UUID.randomUUID().toString().toUpperCase().replace("-", "")+"."+fileType; //文件名,根据UUID来 return putObject(file,fileType,fileName); } /** * * @MethodName: updateFile * @Description: 更新文件:只更新内容,不更新文件名和文件地址。 * (因为地址没变,可能存在浏览器原数据缓存,不能及时加载新数据,例如图片更新,请注意) * @param file * @param fileType * @param oldUrl * @return String */ public static String updateFile(File file,String fileType,String oldUrl){ String fileName = getFileName(oldUrl); if(fileName==null) return null; return putObject(file,fileType,fileName); } /** * * @MethodName: replaceFile * @Description: 替换文件:删除原文件并上传新文件,文件名和地址同时替换 * 解决原数据缓存问题,只要更新了地址,就能重新加载数据) * @param file * @param fileType 文件后缀 * @param oldUrl 需要删除的文件地址 * @return String 文件地址 */ public static String replaceFile(File file,String fileType,String oldUrl){ boolean flag = deleteFile(oldUrl); //先删除原文件 if(!flag){ //更改文件的过期时间,让他到期自动删除。 } return uploadFile(file, fileType); } /** * * @MethodName: deleteFile * @Description: 单文件删除 * @param fileUrl 需要删除的文件url * @return boolean 是否删除成功 */ public static boolean deleteFile(String fileUrl){ config = config==null?new OSSConfig():config; String bucketName = OSSUploadUtil.getBucketName(fileUrl); //根据url获取bucketName String fileName = OSSUploadUtil.getFileName(fileUrl); //根据url获取fileName if(bucketName==null||fileName==null) return false; OSSClient ossClient = null; try { ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName); ossClient.deleteObject(request); } catch (Exception oe) { oe.printStackTrace(); return false; } finally { ossClient.shutdown(); } return true; } /** * * @MethodName: batchDeleteFiles * @Description: 批量文件删除(较快):适用于相同endPoint和BucketName * @param fileUrls 需要删除的文件url集合 * @return int 成功删除的个数 */ public static int deleteFile(List<String> fileUrls){ int deleteCount = 0; //成功删除的个数 String bucketName = OSSUploadUtil.getBucketName(fileUrls.get(0)); //根据url获取bucketName List<String> fileNames = OSSUploadUtil.getFileName(fileUrls); //根据url获取fileName if(bucketName==null||fileNames.size()<=0) return 0; OSSClient ossClient = null; try { ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(fileNames); DeleteObjectsResult result = ossClient.deleteObjects(request); deleteCount = result.getDeletedObjects().size(); } catch (OSSException oe) { oe.printStackTrace(); throw new RuntimeException("OSS服务异常:", oe); } catch (ClientException ce) { ce.printStackTrace(); throw new RuntimeException("OSS客户端异常:", ce); } finally { ossClient.shutdown(); } return deleteCount; } /** * * @MethodName: batchDeleteFiles * @Description: 批量文件删除(较慢):适用于不同endPoint和BucketName * @param fileUrls 需要删除的文件url集合 * @return int 成功删除的个数 */ public static int deleteFiles(List<String> fileUrls){ int count = 0; for (String url : fileUrls) { if(deleteFile(url)){ count++; } } return count; } /** * * @MethodName: putObject * @Description: 上传文件 * @param file * @param fileType * @param fileName * @return String */ private static String putObject(File file,String fileType,String fileName){ config = config==null?new OSSConfig():config; String url = null; //默认null OSSClient ossClient = null; try { ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); InputStream input = new FileInputStream(file); ObjectMetadata meta = new ObjectMetadata(); // 创建上传Object的Metadata meta.setContentType(OSSUploadUtil.contentType(fileType)); // 设置上传内容类型 meta.setCacheControl("no-cache"); // 被下载时网页的缓存行为 PutObjectRequest request = new PutObjectRequest(config.getBucketName(), fileName,input,meta); //创建上传请求 ossClient.putObject(request); url = config.getEndpoint().replaceFirst("https://","https://"+config.getBucketName()+"."+ config.getEndpoint())+"/"+fileName; //上传成功再返回的文件路径 } catch (OSSException oe) { oe.printStackTrace(); return null; } catch (ClientException ce) { ce.printStackTrace(); return null; } catch (FileNotFoundException e) { e.printStackTrace(); return null; } finally { ossClient.shutdown(); } return url; } /** * * @MethodName: contentType * @Description: 获取文件类型 * @param FileType * @return String */ private static String contentType(String fileType){ fileType = fileType.toLowerCase(); String contentType = ""; switch (fileType) { case "bmp": contentType = "image/bmp"; break; case "gif": contentType = "image/gif"; break; case "png": case "jpeg": case "jpg": contentType = "image/jpeg"; break; case "html":contentType = "text/html"; break; case "txt": contentType = "text/plain"; break; case "vsd": contentType = "application/vnd.visio"; break; case "ppt": case "pptx":contentType = "application/vnd.ms-powerpoint"; break; case "doc": case "docx":contentType = "application/msword"; break; case "xml":contentType = "text/xml"; break; case "mp4":contentType = "video/mp4"; break; default: contentType = "application/octet-stream"; break; } return contentType; } /** * * @MethodName: getBucketName * @Description: 根据url获取bucketName * @param fileUrl 文件url * @return String bucketName */ private static String getBucketName(String fileUrl){ String http = "http://"; String https = "https://"; int httpIndex = fileUrl.indexOf(http); int httpsIndex = fileUrl.indexOf(https); int startIndex = 0; if(httpIndex==-1){ if(httpsIndex==-1){ return null; }else{ startIndex = httpsIndex+https.length(); } }else{ startIndex = httpIndex+http.length(); } int endIndex = fileUrl.indexOf(".oss-"); return fileUrl.substring(startIndex, endIndex); } /** * * @MethodName: getFileName * @Description: 根据url获取fileName * @param fileUrl 文件url * @return String fileName */ private static String getFileName(String fileUrl){ String str = "yby6.com/"; int beginIndex = fileUrl.indexOf(str); if(beginIndex==-1) return null; return fileUrl.substring(beginIndex+str.length()); } /** * * @MethodName: getFileName * @Description: 根据url获取fileNames集合 * @param fileUrl 文件url * @return List<String> fileName集合 */ private static List<String> getFileName(List<String> fileUrls){ List<String> names = new ArrayList<>(); for (String url : fileUrls) { names.add(getFileName(url)); } return names; } }
创建Config.properties配置文件到resources下
#阿里云OSS配置 endpoint = oss-img.yby6.com # 访问节点 这里表示 uri访问的图片域名相当于一个域名 bucketName = yangbuyi-img # 你创建的Bucket picLocation = 文件夹路径 随便填 如: yangbuyi/ accessKeyId = 第一张图片要你开通的 ID accessKeySecret = 第一张图片要你开通的 密码
创建SystemConfig.java 处理配置文件
package top.yangbuyi.utils; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * @description: 杨不易网站:www.yby6.com * @program: yangbuyispringcloudparent * @ClassName: SystemConfig * @create: 2020-08-12 00:04 * @author: yangbuyi * @since: JDK1.8 * @SystemConfig: **/ public class SystemConfig { private static final String CONFIG_PROPERTIES="config.properties"; public static String getConfigResource(String key) throws IOException { ClassLoader loader = Thread.currentThread().getContextClassLoader(); Properties properties = new Properties(); InputStream in = loader.getResourceAsStream(CONFIG_PROPERTIES); properties.load(in); String value = properties.getProperty(key); // 编码转换,从ISO-8859-1转向指定编码 value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); in.close(); return value; } }
创建config文件夹下的OSSConfig.java
package top.yangbuyi.utils.config; import top.yangbuyi.utils.SystemConfig; import java.io.IOException; /** * @description: 杨不易网站:www.yby6.com * @program: yangbuyispringcloudparent * @ClassName: OSSConfig * @create: 2020-08-12 00:04 * @author: yangbuyi * @since: JDK1.8 * @OSSConfig: **/ public class OSSConfig{ private String endpoint; //连接区域地址 private String accessKeyId; //连接keyId private String accessKeySecret; //连接秘钥 private String bucketName; //需要存储的bucketName private String picLocation; //图片保存路径 /* * 加载配置文件 初始化 参数 * 也可 yml加载 看你自己 * */ public OSSConfig() { try { this.endpoint = SystemConfig.getConfigResource("endpoint"); this.bucketName = SystemConfig.getConfigResource("bucketName"); this.picLocation = SystemConfig.getConfigResource("picLocation"); this.accessKeyId = SystemConfig.getConfigResource("accessKeyId"); this.accessKeySecret = SystemConfig.getConfigResource("accessKeySecret"); } catch (IOException e) { e.printStackTrace(); } } public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } public String getAccessKeyId() { return accessKeyId; } public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; } public String getAccessKeySecret() { return accessKeySecret; } public void setAccessKeySecret(String accessKeySecret) { this.accessKeySecret = accessKeySecret; } public String getBucketName() { return bucketName; } public void setBucketName(String bucketName) { this.bucketName = bucketName; } public String getPicLocation() { return picLocation; } public void setPicLocation(String picLocation) { this.picLocation = picLocation; } @Override public String toString() { return "OSSConfig{" + "endpoint='" + endpoint + '\'' + ", accessKeyId='" + accessKeyId + '\'' + ", accessKeySecret='" + accessKeySecret + '\'' + ", bucketName='" + bucketName + '\'' + ", picLocation='" + picLocation + '\'' + '}'; } }
在测试当中创建测试类
import org.junit.Test; import top.yangbuyi.utils.OSSUploadUtil; import top.yangbuyi.utils.OSSUtils; import java.io.File; /** * @description: 杨不易网站:www.yby6.com * @program: yangbuyispringcloudparent * @ClassName: two * @create: 2020-08-12 00:06 * @author: yangbuyi * @since: JDK1.8 * @two: OSSUploadUtil.uploadFile(File file, String fileType) //单文件上传,type:文件后缀名 * OSSUploadUtil.updateFile(File file, String fileType, String oldUrl)//更新文件:只更新内容,不更新文件名和文件地址。 * OSSUploadUtil.replaceFile(File file, String fileType, String oldUrl)//替换文件,删除源文件并上传新文件,文件名和地址也改变 * OSSUploadUtil.deleteFile(List<String> fileUrls) //删除多文件,根据问价url来自定获取其中的bucket和文件名,用于bucket和文件名可能存在不同的,循环调用deleteFile方法 * OSSUploadUtil.deleteFile(String fileUrl) //删除单文件 * OSSUploadUtil.deleteFiles(List<String> fileUrls) //删除多文件,根据配置直接取删除多个文件,bucket和文件地址从配置中获取,用于多文件bucket和文件名都相同的 **/ public class two { @Test public void t() { // 文件上传 File file = new File("F:\\美女图片\\dac18dd66fbbf53ddd55563b5edecac6.jpg"); String jpg = OSSUploadUtil.uploadFile(file, "jpg"); System.out.println(jpg); // 更新 只更新 图片 不更新名称 System.out.println("更新图片开始:" + "http://oss-img.yby6.com/github.png"); File file2 = new File("F:\\美女图片\\httpsimg2020.cnblogs.comblog17352552020081735255-20200805220326890-2058657956.jpg"); String jpg1 = OSSUploadUtil.updateFile(file2, "jpg", "http://oss-img.yby6.com/github.png"); System.out.println("更新后的:" + jpg1); // 删除 根据url 删除图片 // boolean b = OSSUploadUtil.deleteFile("https://yangbuyi.oss-cn-beijing.aliyuncs.com/imgBAA8AD5484D847E09BDB535765A9EEB9.jpg"); // System.out.println(b); } }
列举常用的上传
方法名 |
描述 |
OSSUploadUtil.uploadFile(File file, String fileType) |
单文件上传,type:文件后缀名 |
OSSUploadUtil.updateFile(File file, String fileType, String oldUrl) |
更新文件:只更新内容,不更新文件名和文件地址。 |
OSSUploadUtil.deleteFiles(List fileUrls) |
删除多文件,根据配置直接取删除多个文件,bucket和文件地址从配置中获取,用于多文件bucket和文件名都相同的 |
OSSUploadUtil.deleteFile(String fileUrl) |
根据url删除单文件 |
OSSUploadUtil.replaceFile(File file, String fileType, String oldUrl) |
替换文件,删除源文件并上传新文件,文件名和地址也改变 |
OSSUploadUtil.deleteFile(List fileUrls) |
删除多文件,根据问价url来自定获取其中的bucket和文件名,用于bucket和文件名可能存在不同的,循环调用deleteFile方法 |