JavaScript如何上传文件到七牛云(上传视频显示进度条)

背景

之前在后端上传视频到七牛云上,发现上传速度很慢,后来尝试直接在前端上传视频到七牛云上,最后实测发现快了很多。采用前端上传也减轻了服务器压力。

除了七牛云,当然也可以考虑阿里云对象存储oss

参考

七牛云存储示例:http://jssdk.demo.qiniu.io/

官方SDK:https://developer.qiniu.com/kodo/sdk/1283/javascript

swf文件下载SDK里面有

下载地址:https://github.com/qiniu/js-sdk/releases

步骤

视频上传

1、后台生成token字符串给前端:

pom文件引入

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

QiNiuUtil工具类 

package com.jcmx.common.utils;

import com.google.gson.Gson;
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 org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.FileInputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.ZoneOffset;


public class QiNiuUtil {
    static Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

    public static final String accessKey = "";//公钥
    public static final String secretKey = "";//秘钥
    public static final String bucket = "";//空间名
    public static final String path = "";//加速域名

    public static String uploadToken(FileInputStream file, String key) {
        Configuration cfg = new Configuration(Region.region0());//华东地区
        UploadManager uploadManager = new UploadManager(cfg);
        logger.info("path=" + path);
        try {
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);
            System.out.println("token:"+upToken);
            //初始化时区对象,北京时间是UTC+8,所以入参为8
            ZoneOffset zoneOffset=ZoneOffset.ofHours(8);
            //初始化LocalDateTime对象
            LocalDateTime localDateTime=LocalDateTime.now();
            //获取LocalDateTime对象对应时区的Unix时间戳
            System.out.println(localDateTime.toEpochSecond(zoneOffset));
            Long e = localDateTime.toEpochSecond(zoneOffset);
            try {
                Response response = uploadManager.put(file, key, upToken, null, null);
                //解析上传成功的结果
                //DefaultPutRet putRet = JSON.parseObject(response.bodyString(), DefaultPutRet.class);
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                logger.info("key:" + putRet.key);
                String encodedFileName = URLEncoder.encode(putRet.key, "utf-8");
                //获取下载地址
                /*String finalUrl1 = path+"/"+putRet.key;*/
                String finalUrl = String.format("%s/%s", path, encodedFileName);//七牛云公有空间
                String finalUrl1 = auth.privateDownloadUrl(finalUrl,e);//七牛云私有空间路径访问需给路径授权
                logger.info("访问地址:" + finalUrl1);
                return finalUrl1;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**生成Token*/
    public static String getToken() {
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        return upToken;
    }
}

生成token

//七牛Token
@GetMapping("/gettoken")
@ResponseBody
public Map<String,Object> uptoken(){
	Map<String,Object> resultMap = new HashMap<>();
	String token = QiNiuUtil.getToken();
	resultMap.put("uptoken",token);
	return resultMap;
}

2、编写前端代码:

导入JS文件(这里我就不贴代码了,通过七牛云存储示例F12就可以看到对应的JS和css,拷贝到自己的项目里就可以了)

这里我把自己整理的js传到了GitHub上了,下载地址:https://github.com/CAPTAIN-JIE/qiniuUpload.git


 

这是我整理后放到项目里的js目录

页面引入JS文件

<script th:src="@{/js/jquery.min.js}"></script>
<script th:src="@{/js/qiniu/ui.js}"></script>
<script th:src="@{/js/qiniu/qiniu.min.js}"></script>
<script th:src="@{/js/qiniu/highlight.js}"></script>
<script th:src="@{/js/qiniu/main.js}"></script>
<script th:src="@{/js/bootstrap.min.js}"></script>
<script type="text/javascript">hljs.initHighlightingOnLoad();</script>

引入css样式

<link th:href="@{/css/main.css}" rel="stylesheet"/>

Html页面上传视频按钮

<div class="form-group">
    <label class="col-sm-3 control-label">视频文件:</label>
    <div class="col-sm-8">
        <div class="tab-content">
	    <div role="tabpanel" class="tab-pane fade in active" id="demo" aria-labelledby="demo-tab">
	        <div class="row" style="margin-top: 20px;">
	            <div class="col-md-12">
	                <div id="container">
	                <a class="layui-btn" id="pickfiles" href="#" >
			    <i class="fa fa-cloud-upload"></i>
			    <span>选择文件</span>
	                </a>
	                <span class="lbl col-xs-10" style="height: 38px; line-height: 38px;">
		        <span class="red">请上传800M以内的MP4文件</span>
		        </span>
	            </div>
	            <button type="button" class="layui-btn" id="videoRevoke" style="display: none;">
	                <i class="fa fa-undo"></i>撤销视频
	            </button>
	        </div>
	        <div style="display:none" id="success" class="col-md-12">
                    <div class="alert-success">
		    队列全部文件处理完毕
	            </div>
	        </div>
	        <div class="col-md-12" >
		    <table id="uploadInfo" class="table table-striped table-hover text-left"   style="margin-top:40px;display:none">
		        <thead>
			    <tr>
			        <th class="col-md-4">Filename</th>
		                <th class="col-md-2">Size</th>
		                <th class="col-md-6">Detail</th>
			    </tr>
			    </thead>
			    <tbody id="fsUploadProgress">
			    </tbody>
		        </table>
		    </div>
	        </div>
	    </div>
        </div>
    </div>
</div>

 JavaScript编写

/*撤销视频*/
$('#videoRevoke').bind('click',function(){
    $("#container").css("display","block");
    $('#success').css("display","none");
    $('#videoRevoke').css("display","none");
    $('#video_url').remove();
    $('#fsUploadProgress>tr').remove();
})

通过隐藏标签获取上传视频路径传到后端保存到数据库

var resourcesUrl = document.getElementById("video_url").src;

到此上传视频的功能就完成了。

图片上传

下面贴上上传图片的方法(因为图片比较小,对速度影响不大,这里我是通过后端上传的图片)

1、前端代码编写:

Html页面上传图片按钮

<div class="form-group">
    <label class="col-sm-3 control-label">封面:</label>
    <div class="col-sm-8">
	<div class="layui-form-item" id="imageUp">
	    <input name="image_url" id="image_url" autocomplete="off" class="layui-input" type="hidden">
	    <button type="button" class="layui-btn" id="imageupload">
		<i class="fa fa-cloud-upload"></i>上传图片
	    </button>
	    <button type="button" class="layui-btn" id="imageRevoke">
		<i class="fa fa-undo"></i>撤销图片
	    </button>
	    <input class="layui-upload-file" type="file" accept="images" name="file">
	    <span class="lbl col-xs-10" style="height: 38px; line-height: 38px;display: block;">
	        <span class="red">请上传尺寸为750*440的图片!</span>
	    </span>
	    <p id="demoText1"></p>
	</div>
	<div class="layui-upload-list" id="previewBox">
	    <div class="imgBox">
		<img class="layui-upload-img" id="imgs">
	    </div>
	</div>
    </div>
</div>

JavaScript编写

/*撤销图片*/
$('#imageRevoke').bind('click',function(){
    var imgobj = document.getElementById('imgs');
    imgobj.removeAttribute('src');
    $("#imageupload").attr("disabled",false);
    $('#msg').css("display","none");
    var imageUrl = document.getElementById('image_url');
    imageUrl.removeAttribute('src');
})

<script>
    layui.use('upload', function(){
        var $ = layui.jquery
                ,upload = layui.upload;

        //上传图片
        var uploadInst =upload.render({
	    elem: '#imageupload'
	    ,url: '/app/informationTime/uploadImage'
	    ,field:"uploadImage"
	    ,choose: function(obj) {// 选择文件之后,提交文件之前,你想干什么?
	        obj.preview(function (index, file, result) {
	            if (file.size > 0) {// 判断文件大小
		        flag = true;
		        layer.msg("正在上传!");// 此段话,用来拖延用户点击提交按钮的时间,因为不知道covers是否返回
		    }
	        })
	    }
	    ,done: function(res) {
	        $('#image_url').attr("src",res.data);
	        $('#imgs').attr("src",res.data);
	        var demoText = $('#demoText1');
	        demoText.html('<span id="msg" style="color: #ff5722;" style="display: block;">上传成功!</span>');
	        $("#imageupload").attr("disabled",true);
	    }
	    ,error:function () {
	        //演示失败状态,并实现重传
	        var demoText = $('#demoText1');
	        demoText.html('<span id="msg" style="color: #FF5722;" style="display: block;">上传失败!</span> <a class="layui-btn layui-btn-mini demo-reload">重试</a>');
	        demoText.find('.demo-reload').on('click', function () {
	            uploadInst.upload();
		});
	    }
	});
    });
</script>

2、后台代码:

@ApiOperation(value = "上传图片")
@PostMapping("/uploadImage")
@ResponseBody
public Editor uploadImage(@RequestParam("uploadImage") MultipartFile multiple,         HttpSession session, HttpServletRequest request) throws IOException {
    if (multiple != null) {
	String [] str = upload(multiple);
	    return Editor.ResultUtil.success(str);
    }
	return Editor.ResultUtil.success();
}

public String [] upload(MultipartFile multiple){
    FileInputStream inputStream = null;
    try {
	inputStream = (FileInputStream) multiple.getInputStream();
	} catch (IOException e) {
	    e.printStackTrace();
	}
	String fileName = multiple.getOriginalFilename();
	String fileNameExtension = fileName.substring(fileName.lastIndexOf("."), fileName.length());
	String realName = String.valueOf(System.currentTimeMillis()) + ShiroUtils.getLoginName() + fileNameExtension;
	String path = QiNiuUtil.uploadToken(inputStream, realName);
	String [] str = {path};
	return str;
}

以上是js上传文件到七牛云上的步骤,欢迎大家提供好的建议!

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的 Vue 项目中安装 `qiniu-js` 包,这个包可以帮助你将文件上传七牛云。 安装命令:`npm install qiniu-js` 然后,在你的 Vue 组件中引入 `qiniu-js` 包,代码如下: ``` import * as qiniu from 'qiniu-js' ``` 接下来,我们需要实现异步上传文件七牛云的功能。假设我们已经有一个上传文件的方法 `handleUpload`,代码如下: ``` handleUpload(file) { const token = 'your-qiniu-upload-token' // 替换成你的七牛云上传凭证 const key = file.name // 文件名作为七牛云存储的文件名 const config = { useCdnDomain: true, // 是否使用七牛云的 CDN 域名 } const putExtra = { fname: file.name, // 文件原始名字 params: {}, // 上传额外参数 mimeType: null // 上传文件类型 } const observable = qiniu.upload(file, key, token, putExtra, config) const observer = { next(res) { // 上传进度回调 console.log(res.total.percent) }, error(err) { // 上传失败回调 console.log(err) }, complete(res) { // 上传成功回调 console.log(res) } } const subscription = observable.subscribe(observer) // 执行上传操作 } ``` 在上面的代码中,我们通过 `qiniu.upload` 方法来执行文件上传操作,参数依次为: - `file`: 要上传的文件对象 - `key`: 上传七牛云后的文件名 - `token`: 七牛云上传凭证 - `putExtra`: 上传额外参数,包括文件名、上传参数和文件类型 - `config`: 上传配置,包括是否使用七牛云的 CDN 域名 在上传过程中,我们通过观察者模式来监听上传进度、上传成功和上传失败事件,并执行相应的回调函数。 最后,你可以在你的组件中调用 `handleUpload` 方法来上传文件,例如: ``` <el-upload action="" :before-upload="handleUpload" > <el-button type="primary">点击上传</el-button> </el-upload> ``` 在上面的代码中,我们使用了 Element UI 的上传组件,并将 `before-upload` 属性设置为 `handleUpload` 方法,这样就可以触发文件上传操作了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值