New file |
| | |
| | | package com.ruoyi.common.utils.file; |
| | | |
| | | 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<String> 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<String> 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<String> 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<String> 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<Integer, String> 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<String> keys) { |
| | | // 创建OSSClient实例。 |
| | | OSS ossClient = getOSSClient(); |
| | | try { |
| | | // 删除文件。 |
| | | DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys)); |
| | | List<String> 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(); |
| | | } |
| | | |
| | | |
| | | } |