package com.ruoyi.common.utils; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; import java.net.URLEncoder; import java.security.SecureRandom; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j @Component public class OSSUtil { private static final String endpoint = "oss-cn-chengdu.aliyuncs.com"; private static final String accessKeyId = "LTAI5tHYSpwifc3rqLYJoETo"; private static final String accessKeySecret = "xrDyQ89h8P0alWW7rrLIW2D2rt7Eig"; private static final String bucketName = "yizhengcheng"; private static final String FOLDER = "https://yizhengcheng.oss-cn-chengdu.aliyuncs.com/"; /** * 获取oss * * @return */ public static OSS getOSSClient() { return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); } /** * 上传图片 * * @param url * @throws */ public void uploadImg2Oss(String url) throws IOException { File fileOnServer = new File(url); FileInputStream fin; try { fin = new FileInputStream(fileOnServer); String[] split = url.split("/"); this.uploadFile2OSS(fin, split[split.length - 1]); } catch (FileNotFoundException e) { throw new IOException("图片上传失败"); } } public String uploadImg2Oss(MultipartFile file) throws IOException { if (file.getSize() > 5 * 1024 * 1024) { throw new IOException("上传图片大小不能超过5M!"); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 获取文件名 String originalFilename = file.getOriginalFilename(); // 获取文件后缀名 String suffixName = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); // 最后上传生成的文件名 String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + suffixName; // oss中的文件夹名 String objectName = sdf.format(new Date()) + "/" + finalFileName; // name = DateUtils.dateStr(new Date(), "yyyy/MM/dd") + "/" + System.currentTimeMillis() + substring; try { InputStream inputStream = file.getInputStream(); this.uploadFile2OSS(inputStream, objectName); return objectName; } catch (Exception e) { e.printStackTrace(); throw new IOException("图片上传失败"); } } /** * 获得图片路径 * * @param fileUrl * @return */ public String getImgUrl(String fileUrl) { System.out.println(fileUrl); if (!StringUtils.isEmpty(fileUrl)) { // String[] split = fileUrl.split("/"); return this.getUrl(this.FOLDER + fileUrl); } return ""; } /** * 上传到OSS服务器 如果同名文件会覆盖服务器上的 * * @param instream 文件流 * @param fileName 文件名称 包括后缀名 * @return 出错返回"" ,唯一MD5数字签名 */ public String uploadFile2OSS(InputStream instream, String fileName) { String ret = ""; try { OSS ossClient = getOSSClient(); // 创建上传Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(instream.available()); objectMetadata.setCacheControl("no-cache"); objectMetadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf(".")))); objectMetadata.setHeader("Pragma", "no-cache"); // objectMetadata.setContentDisposition("inline;filename=" + fileName); // 上传文件 PutObjectResult putResult = ossClient.putObject(bucketName, FOLDER + fileName, instream, objectMetadata); ret = putResult.getETag(); } catch (IOException e) { log.error(e.getMessage(), e); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } /** * 通过文件名判断并获取OSS服务文件上传时文件的contentType * * @param filenameExtension 文件名 * @return 文件的contentType */ public static final String getContentType(String filenameExtension) { if (filenameExtension.equalsIgnoreCase(".bmp")) { return "application/x-bmp"; } if (filenameExtension.equalsIgnoreCase(".gif")) { return "image/gif"; } if (filenameExtension.equalsIgnoreCase(".jpeg") || filenameExtension.equalsIgnoreCase(".jpg") || filenameExtension.equalsIgnoreCase(".png")) { return "image/jpg"; } 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(".xla") || filenameExtension.equalsIgnoreCase(".xlc") || filenameExtension.equalsIgnoreCase(".xlm") || filenameExtension.equalsIgnoreCase(".xls") || filenameExtension.equalsIgnoreCase(".xlt") || filenameExtension.equalsIgnoreCase(".xlw")) { return "application/vnd.ms-excel"; } if (filenameExtension.equalsIgnoreCase(".xlsx")) { return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; } if (filenameExtension.equalsIgnoreCase(".xml")) { return "text/xml"; } if (filenameExtension.equalsIgnoreCase(".pdf")) { return "application/pdf"; } if (filenameExtension.equalsIgnoreCase(".zip")) { return "application/zip"; } if (filenameExtension.equalsIgnoreCase(".tar")) { return "application/x-tar"; } if (filenameExtension.equalsIgnoreCase(".avi")) { return "video/avi"; } if (filenameExtension.equalsIgnoreCase(".mp4")) { return "video/mpeg4"; } if (filenameExtension.equalsIgnoreCase(".mp3")) { return "audio/mp3"; } if (filenameExtension.equalsIgnoreCase(".mp2")) { return "audio/mp2"; } // 默认下载 // return "application/octet-stream"; return "image/jpg"; } /** * 获得url链接 * * @param key * @return */ public String getUrl(String key) { // 设置URL过期时间为10年 3600l* 1000*24*365*10 OSS ossClient = getOSSClient(); Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10); // 生成URL URL url = ossClient.generatePresignedUrl(bucketName, key, expiration); System.out.println("url: "+url); if (url != null) { String host = "https://" + url.getHost() + url.getPath(); System.out.println("host: "+host); // http://wxcall-xiaobanben.oss-cn-shenzhen.aliyuncs.com/image/20220129/1643469496754508.jpg return host; } return ""; } /** * 获取文件夹 * * @param fileName * @return */ public List fileFolder(String fileName) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); // 构造ListObjectsRequest请求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 设置正斜线(/)为文件夹的分隔符。 listObjectsRequest.setDelimiter("/"); // 设置prefix参数来获取fun目录下的所有文件。 if (!StringUtils.isEmpty(fileName)) { listObjectsRequest.setPrefix(fileName + "/"); } // 列出文件 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍历所有commonPrefix List list = new ArrayList<>(); for (String commonPrefix : listing.getCommonPrefixes()) { String newCommonPrefix = commonPrefix.substring(0, commonPrefix.length() - 1); String[] s = newCommonPrefix.split("/"); if (!StringUtils.isEmpty(fileName)) { list.add(s[s.length - 1]); } else { list.add(s[0]); } } // 关闭OSSClient ossClient.shutdown(); return list; } /** * 列举文件下所有的文件url信息 */ public ObjectListing listFile2(String fileHost, String nextMarker) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); // 构造ListObjectsRequest请求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 设置正斜线(/)为文件夹的分隔符。 listObjectsRequest.setDelimiter("/"); // 列出fun目录下的所有文件和文件夹。 listObjectsRequest.setPrefix(fileHost + "/"); ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍历所有文件。 System.out.println("Objects:"); // objectSummaries的列表中给出的是fun目录下的文件。 for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { System.out.println(objectSummary.getKey()); } // 遍历所有commonPrefix。 System.out.println("\nCommonPrefixes:"); // commonPrefixs列表中显示的是fun目录下的所有子文件夹。由于fun/movie/001.avi和fun/movie/007.avi属于fun文件夹下的movie目录,因此这两个文件未在列表中。 for (String commonPrefix : listing.getCommonPrefixes()) { System.out.println(commonPrefix); } // 关闭OSSClient。 ossClient.shutdown(); return listing; } /** * 列举文件下所有的文件url信息 */ public List listFile(String fileHost, String nextMarker) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); // 构造ListObjectsRequest请求 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 设置prefix参数来获取fun目录下的所有文件。 listObjectsRequest.setPrefix(fileHost + "/"); listObjectsRequest.setMarker(nextMarker); // 列出文件。 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍历所有文件。 List list = new ArrayList<>(); for (int i = 0; i < listing.getObjectSummaries().size(); i++) { String FILE_URL = "http://" + bucketName + "." + endpoint + "/" + listing.getObjectSummaries().get(i).getKey(); list.add(FILE_URL); } // 关闭OSSClient。 ossClient.shutdown(); // ObjectListing objectListing = null; // int total = 0; // HashMap markerMap = new HashMap<>(); // try { // ObjectListing objectListing2 = null; // do { // String nextMarker2 = objectListing2 != null ? objectListing2.getNextMarker() : null; // ListObjectsRequest listObjectsRequest2 = new ListObjectsRequest(bucketName).withMarker(nextMarker2).withMaxKeys(100); // listObjectsRequest2.setPrefix(fileHost + "/"); // objectListing2 = ossClient.listObjects(listObjectsRequest2); // total += (objectListing2 != null && objectListing2.getObjectSummaries() != null ? objectListing2.getObjectSummaries().size() : 0); // markerMap.put(markerMap.size() + 1, nextMarker2); // } while (objectListing2 != null && !StringUtils.isEmpty(objectListing2.getNextMarker())); // // ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(100); // // listObjectsRequest.setPrefix(fileHost + "/"); // // objectListing = ossClient.listObjects(listObjectsRequest); // for (int i = 0; i < objectListing.getObjectSummaries().size(); i++) { // String FILE_URL = "https://" + bucketName + "." + endpoint + "/" + objectListing.getObjectSummaries().get(i).getKey(); // list.add(FILE_URL); // } // // } catch (Exception e) { // // } finally { // // 关闭client // ossClient.shutdown(); // } return list; } /** * 删除文件 * objectName key 地址 * * @param filePath */ public Boolean delFile(String filePath) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); // 删除Object. boolean exist = ossClient.doesObjectExist(bucketName, filePath); if (!exist) { return false; } ossClient.deleteObject(bucketName, filePath); ossClient.shutdown(); return true; } /** * 批量删除 * * @param keys */ public Boolean delFileList(List keys) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); try { // 删除文件。 DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys)); List deletedObjects = deleteObjectsResult.getDeletedObjects(); } catch (Exception e) { e.printStackTrace(); return false; } finally { ossClient.shutdown(); } return true; } /** * 创建文件夹 * * @param folder * @return */ public String createFolder(String folder) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); // 文件夹名 final String keySuffixWithSlash = folder; // 判断文件夹是否存在,不存在则创建 if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { // 创建文件夹 ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); // 得到文件夹名 OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); String fileDir = object.getKey(); ossClient.shutdown(); return fileDir; } return keySuffixWithSlash; } /** * 通过文件名下载文件 * * @param objectName 要下载的文件名 * @param localFileName 本地要创建的文件名 */ public void downloadFile(HttpServletResponse response, String objectName, String localFileName) throws Exception { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); try { // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。 OSSObject ossObject = ossClient.getObject(bucketName, objectName); // 读去Object内容 返回 BufferedInputStream in = new BufferedInputStream(ossObject.getObjectContent()); BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); //通知浏览器以附件形式下载 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName, "utf-8")); //BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(new File("f:\\a.txt"))); byte[] car = new byte[1024]; int L = 0; while ((L = in.read(car)) != -1) { out.write(car, 0, L); } if (out != null) { out.flush(); out.close(); } if (in != null) { in.close(); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭OSSClient。 ossClient.shutdown(); } } public String onlineSee(String key) { // 创建OSSClient实例。 OSS ossClient = getOSSClient(); // 设置URL过期时间为1小时 Date expiration = new Date(new Date().getTime() + 3600 * 1000); // 临时地址 URL url = ossClient.generatePresignedUrl(bucketName, key, expiration); // 关闭OSSClient。 ossClient.shutdown(); return url.toString(); } }