springboot实现七牛云的文件上传下载

一:依赖包

java 复制代码
		<dependency>
			<groupId>com.qiniu</groupId>
			<artifactId>qiniu-java-sdk</artifactId>
			<qiniu-java-sdk.version>7.7.0</qiniu-java-sdk.version>
		</dependency>

二:具体实现

java 复制代码
@RestController
@RequestMapping("/sys/oss/qiniu")
public class OssController {
    @Autowired
    private OssQiNiuHelper ossQiNiuHelper;

    @Value("${jeecg.oss.qiniu.domain}")
    private String fileDomain;

    /**
     * 七牛云文件上传
     *
     * @param file 文件
     * @return
     */
    @PostMapping(value = "/upload")
    public Result<?> upload(MultipartFile file) {
        if (file == null) {
            return Result.error("上传文件不能为空");
        }
        try {
            FileInputStream fileInputStream = (FileInputStream) file.getInputStream();
            String originalFilename = file.getOriginalFilename();
            String fileExtend = originalFilename.substring(originalFilename.lastIndexOf("."));
            String yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            //默认不指定key的情况下,以文件内容的hash值作为文件名
            String fileKey = UUID.randomUUID().toString().substring(0,16).replace("-", "") + "-" + yyyyMMddHHmmss + fileExtend;
            Map<String, Object> map = new HashMap<>();
            DefaultPutRet uploadInfo = ossQiNiuHelper.upload(fileInputStream, fileKey);
            map.put("fileName", uploadInfo.key);
            map.put("name", originalFilename);
            map.put("size", file.getSize());
            //七牛云文件私有下载地址(看自己七牛云公开还是私有配置)
            map.put("url", "http://" + fileDomain + "/" + uploadInfo.key);
            return Result.ok(map);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error(e.getMessage());
        }
    }

    /**
     * 七牛云私有文件下载
     *
     * @param filename 文件名
     * @return
     */
    @GetMapping(value = "/private/file/{filename}")
    public void privateDownload(@PathVariable("filename") String filename, HttpServletResponse response) {
        if (filename.isEmpty()) {
            return;
        }
        try {
            String privateFile = ossQiNiuHelper.getPrivateFile(filename);
            response.sendRedirect(privateFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 七牛云文件下载
     *
     * @param filename 文件名
     * @return
     */
    @RequestMapping(value = "/file/{filename}", method = {RequestMethod.GET})
    public void download(@PathVariable("filename") String filename, HttpServletResponse response) {
        if (filename.isEmpty()) {
            return;
        }
        try {
            String privateFile = ossQiNiuHelper.getFile(filename);
            response.sendRedirect("http://" + privateFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 七牛云文件下载
     *
     * @param filename 文件名
     * @return
     */
    @RequestMapping(value = "/file/delete/{filename}", method = {RequestMethod.GET})
    public Result<?> delete(@PathVariable("filename") String filename, HttpServletResponse response) {
        if (filename.isEmpty()) {
            return Result.error("文件不能为空");
        }
        try {
            boolean delete = ossQiNiuHelper.delete(filename);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.ok("文件删除成功");
    }
}

三:配置类

java 复制代码
@Configuration
public class QiNiuConfig {
    @Value(value = "${jeecg.oss.qiniu.accessKey}")
    private String accessKey;
    @Value(value = "${jeecg.oss.qiniu.secretKey}")
    private String secretKey;
    @Value(value = "${jeecg.oss.qiniu.zone}")
    private String zone;

    /**
     * 初始化配置
     */
    @Bean
    public com.qiniu.storage.Configuration ossConfig() {
        System.out.println(zone);
        switch (zone) {
            case "huadong":
                return new com.qiniu.storage.Configuration(Region.huadong());
            case "huabei":
                return new com.qiniu.storage.Configuration(Region.huabei());
            case "huanan":
                return new com.qiniu.storage.Configuration(Region.huanan());
            case "beimei":
                return new com.qiniu.storage.Configuration(Region.beimei());
            default:
                throw new RuntimeException("存储区域配置错误");
        }
    }

    /**
     * 认证信息实例
     *
     * @return
     */
    @Bean
    public Auth auth() {
        return Auth.create(accessKey, secretKey);
    }

    /**
     * 构建一个七牛上传工具实例
     */
    @Bean
    public UploadManager uploadManager(com.qiniu.storage.Configuration configuration) {
        return new UploadManager(configuration);
    }

    /**
     * 构建七牛空间管理实例
     *
     * @param auth          认证信息
     * @param configuration com.qiniu.storage.Configuration
     * @return
     */
    @Bean
    public BucketManager bucketManager(Auth auth, com.qiniu.storage.Configuration configuration) {
        return new BucketManager(auth, configuration);
    }

    /**
     * Gson
     *
     * @return
     */
    @Bean
    public Gson gson() {
        return new Gson();
    }
}
java 复制代码
@Component
public class OssQiNiuHelper {

    @Value("${jeecg.oss.qiniu.bucketName}")
    private String bucketName;
    @Value("${jeecg.oss.qiniu.domain}")
    private String fileDomain;

    @Autowired
    private Configuration configuration;
    @Autowired
    private UploadManager uploadManager;
    @Autowired
    private BucketManager bucketManager;


    // 密钥配置
    @Autowired
    private Auth auth;
    @Autowired
    private Gson gson;


    //简单上传模式的凭证
    public String getUpToken() {
        return auth.uploadToken(bucketName);
    }

    //覆盖上传模式的凭证
    public String getUpToken(String fileKey) {
        return auth.uploadToken(bucketName, fileKey);
    }

    /**
     * 上传二进制数据
     *
     * @param data
     * @param fileKey
     * @return
     * @throws IOException
     */
    public DefaultPutRet upload(byte[] data, String fileKey) throws IOException {
        Response res = uploadManager.put(data, fileKey, getUpToken(fileKey));
        // 解析上传成功的结果
        DefaultPutRet putRet = gson.fromJson(res.bodyString(), DefaultPutRet.class);
        System.out.println(putRet.key);
        System.out.println(putRet.hash);
        return putRet;
    }

    /**
     * 上传输入流
     *
     * @param inputStream
     * @param fileKey
     * @return
     * @throws IOException
     */
    public DefaultPutRet upload(InputStream inputStream, String fileKey) throws IOException {
        Response res = uploadManager.put(inputStream, fileKey, getUpToken(fileKey), null, null);
        // 解析上传成功的结果
        DefaultPutRet putRet = gson.fromJson(res.bodyString(), DefaultPutRet.class);
        System.out.println(putRet.key);
        System.out.println(putRet.hash);
        return putRet;

    }

    /**
     * 删除文件
     *
     * @param fileKey
     * @return
     * @throws QiniuException
     */
    public boolean delete(String fileKey) throws QiniuException {
        Response response = bucketManager.delete(bucketName, fileKey);
        return response.statusCode == 200 ? true : false;
    }

    /**
     * 获取公共空间文件
     *
     * @param fileKey
     * @return
     */
    public String getFile(String fileKey) throws Exception {
        String encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");
        String url = String.format("%s/%s", fileDomain, encodedFileName);
        return url;
    }


    /**
     * 获取私有空间文件
     *
     * @param fileKey
     * @return
     */
    public String getPrivateFile(String fileKey) throws Exception {
        String encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");
        String publicUrl = String.format("%s/%s", "http://" + fileDomain, encodedFileName);
        long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
        String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
        return finalUrl;
    }

}

四:注意点

4.1.域名备案

使用七牛云的使用必须得备案域名,并且做dns解析,才能用七牛云的加速域名,七牛云默认是有几种解析方式的这里推荐使用dns解析,还有一种文件解析是比较麻烦的不推荐

4.2配置七牛云域名,一般是使用二级域名即可

配置完了二级域名去对应的域名提供服务商解析下记录即可生效

相关推荐
Magnum Lehar29 分钟前
vulkan游戏引擎test_manager实现
java·算法·游戏引擎
sss191s31 分钟前
校招 java 面试基础题目及解析
java·开发语言·面试
异常君34 分钟前
MySQL 中 count(*)、count(1)、count(字段)性能对比:一次彻底搞清楚
java·mysql·面试
洗澡水加冰1 小时前
n8n搭建多阶段交互式工作流
后端·llm
陈随易1 小时前
Univer v0.8.0 发布,开源免费版 Google Sheets
前端·后端·程序员
wkj0011 小时前
QuaggaJS 配置参数详解
java·linux·服务器·javascript·quaggajs
六月的雨在掘金1 小时前
通义灵码 2.5 | 一个更懂开发者的 AI 编程助手
后端
朱龙凯2 小时前
MySQL那些事
后端
异常君2 小时前
MyBatis 中 SqlSessionFactory 和 SqlSession 的线程安全性深度分析
java·面试·mybatis
Re2752 小时前
剖析 MyBatis 延迟加载底层原理(1)
后端·面试