七牛云工具类

该代码示例展示了如何使用七牛云JavaSDK进行文件上传,包括MultipartFile和Base64编码的图片。关键步骤包括设置上传区域、创建上传管理器、生成上传凭证并执行上传操作。此外,还提供了覆盖上传和获取文件访问URL的方法。
摘要由CSDN通过智能技术生成

引入依赖

        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>[7.2.0, 7.2.99]</version>
        </dependency>

上传base64时要注意两个地方:

  1. base64要去掉头部,也就是只发送逗号之后的部分。
  2. 上传域名每个地方都不一样。
    华东空间使用 upload.qiniup.com
    华北空间使用 upload-z1.qiniup.com
    华南空间使用 upload-z2.qiniup.com
    北美空间使用 upload-na0.qiniup.com


package com.wang.test.qiniu;

import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.UrlSafeBase64;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.URLEncoder;

/**
 * 七牛工具类
 * @author Spider Man
 * @date 2023-02-08 16:49
 */

@Slf4j
public class QiNiuUtil {

    private static final String accessKey = "xxx";
    private static final String secretKey = "xxx";
    private static final String bucket = "xxx";
    // [{'zone0':'华东'}, {'zone1':'华北'},{'zone2':'华南'},{'zoneNa0':'北美'},{'zoneAs0':''}]
    private static final Zone zone = Zone.zone1();
    //外链默认域名
    private static final String domainOfBucket = "xxx";
    //# 链接过期时间,单位是秒,3600代表1小时,-1代表永不过期
    private static final long expireInSeconds = -1;


    /**
     * 上传MultipartFile,返回url
     *
     * @param file
     * @param key
     * @param override
     * @return
     * @throws IOException
     */
    public static String uploadMultipartFile(MultipartFile file, String key, boolean override) {
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(zone);
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        DefaultPutRet defaultPutRet = null;
        //把文件转化为字节数组
        InputStream is = null;
        ByteArrayOutputStream bos = null;
        try {
            is = file.getInputStream();
            bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int len = -1;
            while ((len = is.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            byte[] uploadBytes = bos.toByteArray();
            Auth auth = getAuth();
            String upToken;
            if (override) {
                upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
            } else {
                upToken = auth.uploadToken(bucket);
            }
            //进行上传操作,传入文件的字节数组,文件名,上传空间,得到回复对象
            Response response = uploadManager.put(uploadBytes, key, upToken);
             defaultPutRet = JSONUtil.toBean(response.bodyString(), DefaultPutRet.class);
            // System.out.println(putRet.key);//key 文件名
            // System.out.println(putRet.hash);//hash 七牛返回的文件存储的地址,可以使用这个地址加七牛给你提供的前缀访问到这个视频。
        } catch (IOException e) {
            e.printStackTrace();
        }
        assert defaultPutRet != null;
        //返回图片路径
        return "http://"+domainOfBucket+"/"+defaultPutRet.key;
    }


    /**
     * 上传Base64图片  注意,base64的头部要去掉,也就是说要逗号以后的数据
     *
     * @param l        文件大小。支持传入 -1 表示文件大小以 http request body 为准。
     * @param file64   图片base64字符串
     * @param key      文件云端存储的名称
     * @param override 是否覆盖同名同位置文件
     * @return
     * @throws IOException
     */
    public static boolean uploadBase64(int l, String file64, String key, boolean override) throws IOException {
        Auth auth = getAuth();
        String upToken;
        if (override) {
            upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
        } else {
            upToken = auth.uploadToken(bucket);
        }
        //注意:upload.qiniup.com 上传域名适用于华东空间
        // 华北空间使用 upload-z1.qiniup.com
        // 华南空间使用 upload-z2.qiniup.com
        // 北美空间使用 upload-na0.qiniup.com
        String url = "http://upload-z1.qiniup.com/putb64/" + l + "/key/" + UrlSafeBase64.encodeToString(key);

        HttpRequest httpRequest = HttpRequest.post(url).header("Content-Type", "application/octet-stream")
                .header("Authorization", "UpToken " + upToken)
                .body(file64);
        System.out.println(httpRequest.execute().body());
        return httpRequest.execute().isOk();
    }



    /**
     * 获取文件访问地址
     *
     * @param fileName 文件云端存储的名称
     * @return
     * @throws UnsupportedEncodingException
     */

    public static String fileUrl(String fileName) throws UnsupportedEncodingException {
        String encodedFileName = URLEncoder.encode(fileName, "utf-8");
        String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
        Auth auth = getAuth();
        if (-1 == expireInSeconds) {
            return auth.privateDownloadUrl(publicUrl);
        }
        return auth.privateDownloadUrl(publicUrl, expireInSeconds);
    }


    /**
     * 上传本地文件
     *
     * @param localFilePath 本地文件完整路径
     * @param key           文件云端存储的名称
     * @param override      是否覆盖同名同位置文件
     * @return
     */

    public static boolean upload(String localFilePath, String key, boolean override) {

        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(zone);
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken;
        if (override) {
            upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
        } else {
            upToken = auth.uploadToken(bucket);
        }
        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = JSONUtil.toBean(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);
            return true;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
                return false;
            }
            return false;
        }
    }
    public static Auth getAuth() {
        return Auth.create(accessKey, secretKey);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值