package com.qlm.oss; import cn.hutool.core.date.DateUtil; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.PutObjectRequest; import com.jfinal.kit.LogKit; import com.jfinal.upload.UploadFile; import java.io.File; import java.io.InputStream; import java.util.Date; import java.util.UUID; /** * @program: yunpingtai * @ClassName: OssUtil * @description: TODO * @author: 吴英健 * @create: 2025-07-09 10:50 * @Version 1.0 **/ public class OssUtil { /** * 上传文件到OSS * @param uploadFile JFinal上传的文件对象 * @param folder OSS上的文件夹路径,如 "images/" * @return 上传后的完整URL * @throws RuntimeException 上传失败时抛出异常 */ public static String upload(UploadFile uploadFile) { // 验证文件 validateFile(uploadFile); File file = uploadFile.getFile(); String originalFilename = uploadFile.getOriginalFileName(); String fileExt = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); // 生成新的文件名 String newFileName = UUID.randomUUID().toString().replace("-", "") + fileExt; // OSS文件路径 String ossPath = OssConfig.MKDIR + DateUtil.format(new Date(), "yyyyMMdd") + "/" + newFileName; // 创建OSS客户端 OSS ossClient = new OSSClientBuilder().build( OssConfig.ENDPOINT, OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET ); try { // 上传文件 PutObjectRequest putObjectRequest = new PutObjectRequest( OssConfig.BUCKET_NAME, ossPath, file ); ossClient.putObject(putObjectRequest); // 返回完整URL return OssConfig.DOMAIN + "/" + ossPath; } catch (Exception e) { LogKit.error("OSS文件上传失败", e); throw new RuntimeException("文件上传失败: " + e.getMessage()); } finally { // 关闭OSS客户端 if (ossClient != null) { ossClient.shutdown(); } // 删除临时文件 if (file != null && file.exists()) { file.delete(); } } } /** * 通过InputStream上传文件到OSS * @param inputStream 文件输入流 * @param filename 文件名 * @return 上传后的完整URL * @throws RuntimeException 上传失败时抛出异常 */ public static String upload(InputStream inputStream, String filename) { // 验证文件名 if (filename == null || filename.isEmpty()) { throw new RuntimeException("文件名不能为空"); } String fileExt = filename.substring(filename.lastIndexOf(".")).toLowerCase(); // 验证文件类型 boolean allowed = false; for (String ext : OssConfig.ALLOWED_TYPES) { if (ext.trim().equalsIgnoreCase(fileExt)) { allowed = true; break; } } if (!allowed) { throw new RuntimeException("不支持的文件类型,仅支持: " + String.join(", ", OssConfig.ALLOWED_TYPES)); } //不是zip包的情况下 String ossPath = ""; if (!filename.endsWith(".zip")) { // 生成新的文件名 String newFileName = UUID.randomUUID().toString().replace("-", "") + fileExt; // OSS文件路径 ossPath = OssConfig.MKDIR + DateUtil.format(new Date(), "yyyyMMdd") + "/" + newFileName; }else { ossPath = OssConfig.MKDIR + DateUtil.format(new Date(), "yyyyMMdd") + "/" + filename; } // 创建OSS客户端 OSS ossClient = new OSSClientBuilder().build( OssConfig.ENDPOINT, OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET ); try { // 通过InputStream上传文件 PutObjectRequest putObjectRequest = new PutObjectRequest( OssConfig.BUCKET_NAME, ossPath, inputStream ); ossClient.putObject(putObjectRequest); // 返回完整URL return OssConfig.DOMAIN + "/" + ossPath; } catch (Exception e) { LogKit.error("OSS文件上传失败", e); throw new RuntimeException("文件上传失败: " + e.getMessage()); } finally { // 关闭OSS客户端 if (ossClient != null) { ossClient.shutdown(); } // 关闭输入流 if (inputStream != null) { try { inputStream.close(); } catch (Exception e) { LogKit.error("关闭输入流失败", e); } } } } /** * 验证上传文件 */ private static void validateFile(UploadFile uploadFile) { if (uploadFile == null) { throw new RuntimeException("请选择要上传的文件"); } String originalFilename = uploadFile.getOriginalFileName(); if (originalFilename == null || originalFilename.isEmpty()) { throw new RuntimeException("文件名不能为空"); } // 检查文件扩展名 String fileExt = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); boolean allowed = false; for (String ext : OssConfig.ALLOWED_TYPES) { if (ext.trim().equalsIgnoreCase(fileExt)) { allowed = true; break; } } if (!allowed) { throw new RuntimeException("不支持的文件类型,仅支持: " + String.join(", ", OssConfig.ALLOWED_TYPES)); } // 检查文件大小 File file = uploadFile.getFile(); if (file.length() > OssConfig.MAX_SIZE) { throw new RuntimeException("文件大小不能超过 " + (OssConfig.MAX_SIZE / 1024 / 1024) + "MB"); } } }