springboot使用七牛上传文件
在写一个qniu的工具类。
·
ympl中先进配置

在写一个qniu的工具类
package com.jbolt.util; import cn.hutool.core.util.StrUtil; import com.jbolt.ai.common.entity.QiniuConfig; import com.jbolt.ai.common.service.impl.CommonServiceImpl; import com.qiniu.common.QiniuException; import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Configuration; import com.qiniu.storage.Region; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import io.milvus.param.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @Component public class QiniuUtil { @Value("${qiniu.accessKey}") private String accessKey; @Value("${qiniu.secretKey}") private String secretKey; @Value("${qiniu.bucket}") private String bucket; @Value("${qiniu.domain}") private String domain; @Value("${qiniu.region}") private String region; // 七牛云的Access Key private static String ACCESS_KEY; // 七牛云的Secret Key private static String SECRET_KEY; // 七牛云存储空间名称 private static String BUCKET; //域名 private static String DOMAIN; //区域 private static String REGION; private static final Logger logger = LoggerFactory.getLogger(QiniuUtil.class); @PostConstruct public void init() { ACCESS_KEY = accessKey; SECRET_KEY = secretKey; BUCKET = bucket; DOMAIN = domain; REGION = region; } /** * 检查是否已配置七牛云。 * * @return 如果配置存在返回true,否则返回false。 */ private Result isQiniuConfigured() { boolean b = !StrUtil.isEmptyIfStr(ACCESS_KEY) && !StrUtil.isEmptyIfStr(SECRET_KEY) && !StrUtil.isEmptyIfStr(REGION) && !StrUtil.isEmptyIfStr(DOMAIN); logger.error("配置文件中没有找到七牛的相关配置"); if (b) { return Result.error("请在配置文件中添加七牛云的相关配置。"); } return Result.success(); } /** * 生成指定bucket的token & region * * @param * @return */ public Result genUploadToken() { if (isQiniuConfigured().isError()) { return isQiniuConfigured(); } Map<String, String> map = new HashMap<>(); String qiniuToken = CacheUtil.get(CacheUtil.KEY_QINIU_TOKEN); if (qiniuToken != null) { //token未过期 map.put("token", qiniuToken); map.put("region", REGION); map.put("domain", DOMAIN); logger.info("从缓存中获取七牛的token,设置过期时间为55分钟-----{}:", qiniuToken); } else {//token 已过期 // 创建Auth对象 Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); // 生成上传凭证 String str = auth.uploadToken(BUCKET); map.put("token", str); map.put("region", REGION); map.put("domain", DOMAIN); //这个地方的过期时间是55分钟,因为auth.uploadToken获取token的时候,源码里的token是60分钟失效 CacheUtil.put(CacheUtil.KEY_QINIU_TOKEN, str, 55, TimeUnit.MINUTES); logger.info("根据uploadToken接口获取七牛的token,设置过期时间为55分钟,已放入缓存-----{}:", str); } return Result.success(map); } /** * 通用的上传文件逻辑,支持字节数组和文件类型的文件上传 * * @param fileData 要上传的文件数据,可以是字节数组或者File对象 * @param fileName 上传到七牛云存储后的文件名(键) * @return 包含上传结果信息的Result对象,如果上传成功则包含文件访问地址,否则包含错误信息 * @throws QiniuException 如果上传过程出现七牛云相关异常 */ public Result<String> uploadFile(Object fileData, String fileName) throws QiniuException { if (isQiniuConfigured().isError()) { return isQiniuConfigured(); } Configuration cfg = new Configuration(Region.region0()); UploadManager uploadManager = new UploadManager(cfg); Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); String upToken = auth.uploadToken(BUCKET); Response response; if (fileData instanceof byte[]) { response = uploadManager.put((byte[]) fileData, fileName, upToken); } else if (fileData instanceof File) { response = uploadManager.put((File) fileData, fileName, upToken); } else { logger.error("不支持的文件数据类型: {}", fileData.getClass().getName()); return Result.error("上传文件的数据类型不被支持,请检查传入参数。"); } if (response.statusCode == 200) { String accessUrl = DOMAIN + "/" + fileName; logger.info("上传成功, 访问地址为: {}", accessUrl); return Result.success(accessUrl); } handleUploadError(response, fileName); String url = retryUpload(fileData, fileName, uploadManager, upToken); return Result.success(url); } /** * 处理上传失败时的错误,根据具体错误码等做相应处理(这里示例可根据实际进一步细化) * * @param response 上传操作返回的响应对象 * @param fileName 上传的文件名,用于在日志中更清晰地记录错误关联信息 */ private static void handleUploadError(Response response, String fileName) { logger.error("上传文件 {} 失败, 错误信息: {}", fileName, response.toString()); } /** * 重试上传文件逻辑,兼容字节数组和文件类型的文件数据 * * @param fileData 要上传的文件数据,可以是字节数组或者File对象 * @param key 上传到七牛云存储后的文件名(键) * @param uploadManager 上传管理器实例 * @param upToken 上传凭证 * @return 文件在七牛云的访问URL,如果重试后仍然失败返回null * @throws QiniuException 如果重试过程出现异常 */ private static String retryUpload(Object fileData, String key, UploadManager uploadManager, String upToken) { int retry = 0; while (retry < 3) { try { Response response; if (fileData instanceof byte[]) { response = uploadManager.put((byte[]) fileData, key, upToken); } else if (fileData instanceof File) { response = uploadManager.put((File) fileData, key, upToken); } else { logger.error("不支持的文件数据类型用于重试上传: {}", fileData.getClass().getName()); return null; } if (response.statusCode == 200) { String url = DOMAIN + "/" + key; logger.info("重试上传成功, 访问地址为: {}", url); return url; } handleUploadError(response, key); } catch (QiniuException e) { handleRetryError(e, key); } retry++; } return null; } /** * 处理重试上传过程中的异常(这里示例可根据实际进一步细化) * * @param e 重试上传出现的七牛云异常 * @param key 上传的文件名,用于在日志中更清晰地记录错误关联信息 */ private static void handleRetryError(QiniuException e, String key) { logger.error("重试上传文件 {} 出现异常,异常信息:{}", key, e.getMessage()); } }
测试使用
/**
* 上传文件并返回地址
*
* @param file
* @return
*/
public Result uploadFile(MultipartFile file) {
try {
//todo 上传到指定的文件夹下
return qiniuUtil.uploadFile(file.getBytes(), file.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
}
return Result.error("异常");
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)