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配置七牛云域名,一般是使用二级域名即可

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

相关推荐
daidaidaiyu2 小时前
一文学习 工作流开发 BPMN、 Flowable
java
H5css�海秀3 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
SuniaWang3 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长3 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34163 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
m0_726965984 小时前
面面面,面面(1)
java·开发语言
代码栈上的思考5 小时前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
xuhaoyu_cpp_java5 小时前
过滤器与监听器学习
java·经验分享·笔记·学习
程序员小假5 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha6 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端