七牛云上传文件-业务逻辑以及代码讲解

一、七牛云上传逻辑以及基本属性

七牛云作为第三方文件存储服务,它的一个亮点在于能够让客户端上传文件的请求直接发送到七牛云的文件存储服务端,绕过了我们的业务服务端,传统的第三方服务往往是将上传文件的请求发送到我们的业务服务,再由业务服务端向七牛云服务端发送上传文件请求,这样做的好处是可以降低业务服务端的负载,要知道上传文件的请求是带着文件数据的,比一般的请求要大很多,七牛云的做法可以降低业务服务端的负载。

(一)上传逻辑

虽然上传文件的请求绕过了服务器,但这并不代表业务服务器不发挥作用,接下来我们来讲一讲客户端直接向七牛云服务端上传文件的顺序

  1. 向业务服务器发送获取token的请求,再由业务服务端向七牛云端发送创建token的请求,七牛云端生成token后返回给业务服务端,再由业务服务端将token返回给客户端
    在这里插入图片描述
    在这里插入图片描述

  2. 客户端拿到token后,向服务端发送上传文件的请求
    在这里插入图片描述
    在这里插入图片描述
    img-blog.csdnimg.cn/4300a0f1472b4cae8517f1d135edecbe.png)

注意:最后返回的格式是可以再代码里面自定义的,在向七牛云端发送生成token请求时,设置returnBody的属性来定义

(二)基本属性

accessKey: 3TXiPfgyRqQ_ddudAJnljppLYI1upX  //访问key
secretKey: tezQ5Rmy05w7yCecjlEVADxYd   //密钥
domainOfBucket: http://resxxxxx.hb-bkt.clouddn.com  //加速域名,通过该域名可以快速访问文件
bucket:xc-online //命名空间
dedaline:3600 //token有效时间

二、代码讲解

(一)生成token请求(客户端与七牛云端交互)

  @Override
    public String generateToken(UploadStrategy uploadStrategy, Map<String, Object> params) {
        if (params.get("tokenType").equals("1")) { //1表示获得上传凭证
            Auth auth = Auth.create(accessKey, secretKey);
            String key = (String) params.get("key");
            //设置上传文件后,七牛云端返回给客户端的json格式
            StringMap putPolicy = new StringMap();
            putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fname\":\"$(fname)\",\"fsize\":$(fsize)}");
            putPolicy.put("returnBodyType", "application/json");
            //key若不为null则表示上传的文件会对某名字等于key的文件进行覆盖,若七牛云端不存在名字等于key的文件,则报错
            //key设为null表示普通上传,由于我们不是覆盖某文件,所以将key设为null
            String upToken = auth.uploadToken(uploadStrategy.getScope(), null, uploadStrategy.getDeadline(), putPolicy, false);
            return upToken;
        } else if (params.get("tokenType").equals("2")) { //2表示获得下载凭证
            //TODO 申请获得七牛云的下载凭证
            return null;

        } else if (params.get("tokenType").equals("3")) { //3表示获得管理凭证
            //TODO 申请获得七牛云的管理凭证
            return null;
        }
        return null;
    }

(二)服务端传文件给七牛云(服务端与七牛云交互)

上面我们讲了如何让客户端与七牛云交互的逻辑与代码,同时,七牛云也支持我们通过服务端向七牛云发送上传文件的请求,服务端得到回应后,再返回给客户端。

public FileObject uploadOnce(MultipartFile file,String bucket,String resourceKey,Long deadline){
        Auth auth = Auth.create(accessKey, secretKey);
        StringMap putPolicy = new StringMap();
        //设置上传文件后七牛云向我们返回的格式
        putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fname\":\"$(fname)\",\"fsize\":$(fsize)}");
        putPolicy.put("returnBodyType", "application/json");
        String uploadToken = auth.uploadToken(bucket, null, deadline, putPolicy, false);

        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone1());
        //其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);

        try {
            Response file_response = uploadManager.put(file.getInputStream(), resourceKey, uploadToken, null, null);
            //解析上传成功的结果
            DefaultPutRet file_putRet = new Gson().fromJson(file_response.bodyString(), DefaultPutRet.class);
            if (file_response.statusCode != 200) {
                return null;
            }

            FileObject fileObject = new FileObject();
            fileObject.setFileName(file.getOriginalFilename());
            fileObject.setOrigin("qiniu");
            fileObject.setResourceKey(file_putRet.key);
            fileObject.setProtect(true);
            fileObject.setUploadDate(LocalDateTime.now());
            return fileObject;
        }catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
            return null;
        }
    }

更多操作,请访问:https://developer.qiniu.com/kodo/1239/java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Spring Boot整合七牛云上传文件,可以按照以下步骤进行: 1.引入七牛云Java SDK 在pom.xml中引入七牛云Java SDK: ```xml <dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>[7.2.0,)</version> </dependency> ``` 2.配置七牛云参数 在application.yml或application.properties中添加七牛云的参数: ```yml qiniu: accessKey: your_access_key secretKey: your_secret_key bucket: your_bucket_name domain: your_domain_name ``` 3.编写上传文件代码 在需要上传文件的地方编写上传文件代码,示例代码如下: ```java @Service public class QiniuService { @Autowired private QiniuConfig qiniuConfig; /** * 上传文件七牛云 * * @param file 文件对象 * @return 文件访问URL */ public String uploadFile(File file) throws QiniuException { // 构造一个带指定Zone对象的配置类 Configuration cfg = new Configuration(Zone.autoZone()); // ...其他参数参考类注释 UploadManager uploadManager = new UploadManager(cfg); // 生成上传凭证,然后准备上传 String accessKey = qiniuConfig.getAccessKey(); String secretKey = qiniuConfig.getSecretKey(); String bucket = qiniuConfig.getBucket(); // 如果是Windows情况下,格式是 D:\\qiniu\\test.png String localFilePath = file.getAbsolutePath(); // 默认不指定key的情况下,以文件内容的hash值作为文件名 String key = null; Auth auth = Auth.create(accessKey, secretKey); String upToken = auth.uploadToken(bucket); try { Response response = uploadManager.put(localFilePath, key, upToken); // 解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); return qiniuConfig.getDomain() + "/" + putRet.key; } catch (QiniuException ex) { Response r = ex.response; System.err.println(r.toString()); try { System.err.println(r.bodyString()); } catch (QiniuException ex2) { // ignore } throw ex; } } } ``` 4.测试上传文件 在测试类中编写测试上传文件代码,示例代码如下: ```java @RunWith(SpringRunner.class) @SpringBootTest public class QiniuServiceTest { @Autowired private QiniuService qiniuService; @Test public void testUploadFile() throws QiniuException { File file = new File("test.png"); String url = qiniuService.uploadFile(file); System.out.println(url); } } ``` 其中,test.png是要上传的文件名。运行测试类即可上传文件七牛云,并返回文件的访问URL。 以上就是Spring Boot整合七牛云上传文件的全部步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值