七牛云对象存储客户端直传前后端实现 【spring cloud + vue】

两种文件上传的方式

服务端传输

服务端传输

客户端直传

客户端直传

两种传输方式比较

  • 服务端传输,所有客户端的上传请求需发送至业务服务器,再由业务服务器转发至文件服务器,上传结果的返回同样需要业务服务器的转发,这样的操作保证了传输的安全,但却大大提升了业务服务器的压力,增加了传输的时间及成本;

  • 客户直传是由客户端到业务服务器取得文件上传令牌,然后携令牌上传文件至文件服务器,这样很好的保证了安全的同时,极大的提高了传输效率;

客户端直传实现

服务端实现

  • 引入七牛的Java SDK
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.10</version>
        </dependency>
  • 提供客户端获取upToken接口
@RestController
public class FileUploadApi {

    @Value("${qiniu.ak}")
    private String QINIU_AK;
    @Value("${qiniu.sk}")
    private String QINIU_SK;
    @Value("${qiniu.bucket}")
    private String QINIU_BUCKET;

    //获取七牛云上传token
    @GetMapping(path = "upToken")
    public String getUpToken() {
        Auth auth = Auth.create(QINIU_AK, QINIU_SK);
        String upToken = auth.uploadToken(QINIU_BUCKET);
        return upToken;
    }

}

其中BUCKET、AK、SK 在七牛云控制台获取

前端实现

<template>
    <div class="app-container">
        <form id="fileUploadForm" method="post" action="http://up-z2.qiniu.com">
            <input name="file" type="file" />
            <input name="accept" type="hidden" />
        </form>

        <img :src="img" alt="">

        <button @click="upload">上传</button>
    </div>
</template>

<script>
const qiniu = require('qiniu')
const uuid = require('uuid/v4')
const request = require('../utils/request')
import fileUploadApi from '../api/FileUploadApi'

export default {
    name:'UploadFile',
    data:function(){
        return {
            key:uuid(),
            upToken:'',
            img:'',
        }
    },
    methods:{
        upload:function(){
            const _this = this;
            //上传的文件名使用uuid
            _this.key = uuid()
            console.log(_this.key)
            //获取formData
            var formData = new FormData(document.getElementById('fileUploadForm'))
            //从服务端获取upToken
            fileUploadApi.getUpToken()
                .then(function(data){
                    if(data == null || data.lenth == 0){
                        return
                    }
                    _this.upToken = data.toString()

                    //fileForm,upToken,key,otherOpt
                    //上传图片文件
                    fileUploadApi.upload(formData,_this.upToken,_this.key,null)
                        .then(function(data){
                            if (data.key){
                                //获取七牛云key 并生成图片外链 展示
                                _this.img = fileUploadApi.getDownloadURL(data.key)
                            }
                        })
                }).catch(function(){
                    return
                })
        }
    }

}
</script>

这里主要采用了HTML5 的formData对表单中的file input进行数据提取,提取出的数据通过axios异步提交

import request from '../utils/request'
import global from '../utils/global'
/**
 * 文件上传API
 */
export default{

    //获取上传upToken
    getUpToken:function(){
        return request({
            url:'/hnister-file-service/upToken',
            method:'get'
        })
    },
    //以表单方式上传文件 参考:
    //https://developer.qiniu.com/kodo/manual/1272/form-upload
    upload: function(fileForm,upToken,key,otherOpt){
        if (!otherOpt){
            otherOpt = {}
        }

        fileForm.append('key',key)
        fileForm.append('token',upToken)
        for(k in Object.keys(otherOpt)){
            fileForm.append(k,otherOpt[k])
        }
        return request({
            url:global.address.qiniuUploadURL,
            baseURL:'',
            method:'post',
            data:fileForm,
            headers:{'Content-Type':'multipart/form-data'}
        })
    },
    //上传后返回的key 获取文件外链
    getDownloadURL:function(key){
        return global.address.qiniuDownloadURL + '/' + key;
    }
}

文件上传API

import axios from 'axios'
import global from './global'

// 创建axios实例
const service = axios.create({
    // baseURL: process.env.BASE_API, // api的base_url
    baseURL: global.address.zuul,
    timeout: 15000 // 请求超时时间
})

const responseFun = function (response) {
    return response.data;
}

// respone拦截器
service.interceptors.response.use(
    responseFun,
    error => {
        return Promise.reject(error)
    }
)

export default service;

对axios 进行封装和拦截

const address = {
    zuul:'http://localhost:10000',
    //七牛云的华南区文件上传地址
    qiniuUploadURL:'http://up-z2.qiniu.com',
    //我的七牛云图片下载host
    qiniuDownloadURL:'http://p4fkxpg80.bkt.clouddn.com',
}

export default{
    address
}

保存全局变量

前端实现DEMO 的地址:

vue-qiniu

END

效果

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 首先,需要在七牛云上创建一个存储空间,并获取该存储空间的accessKey、secretKey、bucket和domain。 2. 在Springboot中引入七牛云的Java SDK,可以通过Maven或Gradle进行引入。例如,在Maven中添加以下依赖: ``` <dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>[7.2.0, 7.2.99]</version> </dependency> ``` 3. 创建一个七牛云的配置类,用于存储accessKey、secretKey、bucket和domain等配置信息。 ``` @Configuration public class QiniuConfig { @Value("${qiniu.accessKey}") private String accessKey; @Value("${qiniu.secretKey}") private String secretKey; @Value("${qiniu.bucket}") private String bucket; @Value("${qiniu.domain}") private String domain; @Bean public Auth auth() { return Auth.create(accessKey, secretKey); } @Bean public Configuration configuration() { return new Configuration(Zone.zone0()); } @Bean public UploadManager uploadManager() { return new UploadManager(configuration()); } @Bean public BucketManager bucketManager() { return new BucketManager(auth(), configuration()); } @Bean public StringMap putPolicy() { StringMap putPolicy = new StringMap(); putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"name\":\"$(fname)\",\"size\":$(fsize)}"); return putPolicy; } @Bean public String uploadToken() { return auth().uploadToken(bucket, null, 3600, putPolicy()); } @Bean public String domain() { return domain; } } ``` 4. 在Vue中使用element-ui的上传组件,设置上传的接口为Springboot的接口。 ``` <el-upload class="upload-demo" action="/api/upload" :show-file-list="false" :on-success="handleSuccess" :before-upload="beforeUpload" :headers="{Authorization: 'Bearer ' + token}" > <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> ``` 5. 在Springboot中编写上传接口,在该接口中使用七牛云的Java SDK进行上传。 ``` @RestController @RequestMapping("/api") public class UploadController { @Autowired private UploadManager uploadManager; @Autowired private String uploadToken; @Autowired private String domain; @PostMapping("/upload") public ResponseEntity<?> upload(@RequestParam("file") MultipartFile file) throws IOException { try { Response response = uploadManager.put(file.getBytes(), null, uploadToken); if (response.isOK()) { String key = JSON.parseObject(response.bodyString()).getString("key"); return ResponseEntity.ok(domain + "/" + key); } } catch (QiniuException e) { e.printStackTrace(); } return ResponseEntity.badRequest().build(); } } ``` 6. 程序运行后,在Vue中上传图片即可自动将图片上传到七牛云,并返回图片的访问URL。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值