【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
一、pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.atzhongruan</groupId> <artifactId>springboot_oss</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot_oss</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4</version> </dependency> <!-- 阿里对象存储 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
二、OSSUtil
package com.atzhongruan.springboot_oss.utils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.time.DateUtils; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSSClient; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.DeleteObjectsResult; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import com.fasterxml.jackson.annotation.JsonValue; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Date; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; /** * <一句话功能简述> * <功能详细描述> * * @author Administrator * @version [版本号, 2019/12/13 0013] * @see [相关类/方法] * @since [产品/模块版本] */ public class OssUtil { /** * 域名 */ private final static String OSS_END_POINT = "http://oss-cn-beijing.aliyuncs.com"; /** * 账号 */ private final static String OSS_ACCESS_KEY_ID = "AI4FoJBmgdjQrYA5tePDDi"; /** * 密匙 */ private final static String OSS_ACCESS_KEY_SECRET = "oDCrl6NedxMgFazOscSB1lWemGsy"; /** * 存储空间 */ private final static String OSS_BUCKET_NAME = "zzx-oss"; /** * URL有效期 */ private final static Date OSS_URL_EXPIRATION = DateUtils.addDays(new Date(), 365 * 10); private volatile static OSSClient instance = null; private OssUtil() { } /** * Oss 实例化 * * @return */ private static OSSClient getOssClient() { if (instance == null) { synchronized (OssUtil.class) { if (instance == null) { instance = new OSSClient(OSS_END_POINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET); } } } return instance; } /** * 文件路径的枚举 */ public enum FileDirType { ARTICLE_IMAGES("article_images"), ARTICLE_VIDEO("article_video"), CAROUSEL("carousel"), MENU("menu"); private String dir; FileDirType(String dir) { this.dir = dir; } @JsonValue public String getDir() { return dir; } } /** * 当Bucket 不存在时候创建Bucket */ private static void createBuchet() { try { if (!OssUtil.getOssClient().doesBucketExist(OSS_BUCKET_NAME)) { OssUtil.getOssClient().createBucket(OSS_BUCKET_NAME); } } catch (Exception e) { e.printStackTrace(); throw new ClientException("创建Bucket失败,请核对Bucket名称(规则:只能包含小写字母、数字和短横线,必须以小写字母和数字开头和结尾,长度在3-63之间)"); } } /** * 文件上传的文件后缀 * * @param FilenameExtension * @return */ private static String getContentType(String FilenameExtension) { if (FilenameExtension.equalsIgnoreCase("jpeg") || FilenameExtension.equalsIgnoreCase("jpg") || FilenameExtension.equalsIgnoreCase("png")) { return "image/jpeg"; } return "multipart/form-data"; } /** * 上传OSS服务器 如果同名文件会覆盖服务器上的 * * @param file * @param fileDirType * @return */ private static String uploadFile(MultipartFile file, FileDirType fileDirType) { String fileName = String.format("%s.%s", UUID.randomUUID().toString(), FilenameUtils.getExtension(file.getOriginalFilename())); try (InputStream inputStream = file.getInputStream()) { ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(inputStream.available()); objectMetadata.setCacheControl("no-cache"); objectMetadata.setHeader("Pragma", "no-cache"); objectMetadata.setContentType(FilenameUtils.getExtension("." + file.getOriginalFilename())); objectMetadata.setContentDisposition("inline;filename=" + fileName); PutObjectResult putObjectResult = OssUtil.getOssClient().putObject(OSS_BUCKET_NAME, fileDirType.getDir() + "/" + fileName, inputStream, objectMetadata); System.out.println(putObjectResult); return fileDirType.getDir() + "/" + fileName; } catch (OSSException oe) { System.out.println("Error Message: " + oe.getErrorCode()); System.out.println("Error Code: " + oe.getErrorCode()); System.out.println("Request ID: " + oe.getRequestId()); System.out.println("Host ID: " + oe.getHostId()); return null; } catch (ClientException ce) { System.out.println("Error Message: " + ce.getMessage()); return null; } catch (IOException e) { System.out.println("Error Message: " + e.getMessage()); return null; } } /** * 获取文件路径 * * @param fileUrl * @param fileDirType * @return */ private static String getFileUrl(String fileUrl, FileDirType fileDirType) { if (StringUtils.isEmpty(fileUrl)) { throw new RuntimeException("文件地址为空!"); } String[] split = fileUrl.split("/"); URL url = OssUtil.getOssClient().generatePresignedUrl(OSS_BUCKET_NAME, fileDirType.getDir() + "/" + split[split.length - 1], OSS_URL_EXPIRATION); if (url == null) { throw new RuntimeException("获取OSS文件URL失败!"); } return url.toString(); } /** * 文件上传 去掉URL中的?后的时间戳 * * @param file * @param fileDirType * @return */ public static String upload(MultipartFile file, FileDirType fileDirType) { OssUtil.createBuchet(); String fileName = OssUtil.uploadFile(file, fileDirType); String fileOssUrl = OssUtil.getFileUrl(fileName, fileDirType); int firstChar = fileOssUrl.indexOf("?"); if (firstChar > 0) { fileOssUrl = fileOssUrl.substring(0, firstChar); } return fileOssUrl; } /** * 获取路径地址 * * @param fileName * @return */ public static String getPathUrl(String fileName) { return fileName.substring(fileName.indexOf(OSS_END_POINT) + OSS_END_POINT.length() + 1); } /** * 文件删除 * * @param keys */ public static void delete(List<String> keys) { List<String> newKeys = keys.stream().map((item) -> { return OssUtil.getPathUrl(item); }).collect(Collectors.toList()); try { DeleteObjectsResult deleteObjectsResult = OssUtil.getOssClient().deleteObjects(new DeleteObjectsRequest(OSS_BUCKET_NAME).withKeys(newKeys)); List<String> deletedObjects = deleteObjectsResult.getDeletedObjects(); System.out.println(deletedObjects); } catch (OSSException oe) { System.out.println("Error Message: " + oe.getErrorCode()); System.out.println("Error Code: " + oe.getErrorCode()); System.out.println("Request ID: " + oe.getRequestId()); System.out.println("Host ID: " + oe.getHostId()); } catch (ClientException ce) { System.out.println("Error Message: " + ce.getMessage()); } } }
三、实体类 JsonResult
public class JsonResult { private String code; private String message; //get和set和构造函数 }
四、测试类TestController
package com.atzhongruan.springboot_oss.controller; import com.atzhongruan.springboot_oss.common.JsonResult; import com.atzhongruan.springboot_oss.utils.OssUtil; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; /** * <一句话功能简述> * <功能详细描述> * * @author Administrator * @version [版本号, 2019/12/13 0013] * @see [相关类/方法] * @since [产品/模块版本] */ @RestController public class TestController { /** * @return * @function 视频上传 */ @PostMapping("/article/uploadVideo") public JsonResult uploadVideo(@RequestParam(value = "file", required = false) MultipartFile file) { if (file == null) { return new JsonResult("500", "内容为空"); } else { return new JsonResult("200", OssUtil.upload(file, OssUtil.FileDirType.ARTICLE_VIDEO)); } } /** * @param file * @return * @function 图片上传 */ @PostMapping("/article/uploadImage") public JsonResult uploadImages(@RequestParam(value = "file", required = false) MultipartFile file) { if (file == null) { return new JsonResult("500", "内容为空"); } else { return new JsonResult("200", OssUtil.upload(file, OssUtil.FileDirType.ARTICLE_IMAGES)); } } // /** // * 删除OSS对象 // * // */ // @Override // public boolean deleteArtImg(Integer artId) { // List<ArticleImages> images = imagesMapper.selectImagesList(artId); // List<String> strings = images // .stream() // .map(item -> item.getImgUrl()) // .collect(Collectors.toList()) // .stream() // .filter((item) -> item.length() > 0) // .collect(Collectors.toList()); // if(strings.size() > 0){ // imagesMapper.deleteImagesList(artId); // OssUtil.delete(strings); // } // return true; // } }
五、结构图
参考文章:https://blog.csdn.net/yhflyl/article/details/86406641
来源:oschina
链接:https://my.oschina.net/u/4117203/blog/3142511