iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue实现大文件分片上传与断点续传到七牛云
  • 642
分享到

vue实现大文件分片上传与断点续传到七牛云

2024-04-02 19:04:59 642人浏览 安东尼
摘要

问题: 前段时间做视频上传业务,通过网页上传视频到服务器。 视频大小 小则几十M,大则 1G+,以一般的Http请求发送数据的方式的话,会遇到的问题: 1、文件过大,超出服务端的请求

问题:

前段时间做视频上传业务,通过网页上传视频到服务器

视频大小 小则几十M,大则 1G+,以一般的Http请求发送数据的方式的话,会遇到的问题:

  • 1、文件过大,超出服务端的请求大小限制;
  • 2、请求时间过长,请求超时;
  • 3、传输中断,必须重新上传导致前功尽弃;

探索过程:

1、原先咨询过组里的大佬给我推荐了百度的WEBupload,但后来引入之后发现它是基于Jquery封装的。由于本身项目是基于Vue开发的所以与jquery相关的开源框架就尽量不考虑了。

2、后来查阅了资料后自己手动实现了文件切片上传到服务器基本需求已经实现,但由于效率及稳定性问题后来决定还是直传文件到七牛云。一开始我使用了表单上传的方式实现了,后来种种原因又要求我做成分片上传。

3、引入七牛的jssdk。

解决方案:

  • 1、修改服务端上传的限制配置;Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好;
  • 2、大文件分片,一片一片的传到服务端,再由服务端合并。这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分片的大小可以控制在4MB以内,服务端限制在4M即可。
  • 3、使用七牛javascript SDK分片上传

首先,刚接触一门新的技术我们还是先去官方文档走一圈了解下基本用法~

文档地址:JavaScript SDK

Qiniu-JavaScript-SDK 为客户端 SDK,没有包含 token 生成实现,为了安全token 建议通过网络从服务端获取,具体生成代码可以参考服务端 SDK 的文档。

  • JavaScript SDK 下载地址
  • JavaScript SDK 源码地址
  • JavaScript SDK 在线示例

功能简介

  • 上传
    • 大于 4M 时可分块上传,小于 4M 时直传
    • 分块上传时,支持断点续传
  • 数据处理(图片)
    • imageView2(缩略图)
    • imageMogr2(高级处理,包含缩放、裁剪、旋转等)
    • imageInfo (获取基本信息)
    • exif (获取图片 EXIF 信息)
    • watermark (文字、图片水印)
    • pipeline (管道,可对 imageView2、imageMogr2、watermark 进行链式处理)

后端返回给你的获取token的JSON格式必须是这种格式的。必须是一个json对象内部包裹着uptoken字段,带上其他字段也是可以的但是必须第一层要能找到uptoken

{
   "uptoken": "0MLvWPnyya1WtPnXFy9KLyGHyFPNdZceomL...",
   "xxx": "..."
}

因为在它的sdk源码中是这么获取token的。他会先找定义的option字段中是否有uptoken,如果没有再去找uptoken_url有就发送ajax请求去获取uptoken字段,倘若后端必须要以他的格式为主那你可以修改sdk源码来实现。如果uptoken_url也没有值就回去调用uptoken_func函数都没有则报错,所以这三个必须指定一个。

        // getUptoken maybe called at Init Event or BeforeUpload Event
       // case Init Event, the file param of getUpTKEn will be set a null value
       // if op.uptoken has value, set uptoken with op.uptoken
       // else if op.uptoken_url has value, set uptoken from op.uptoken_url
       // else if op.uptoken_func has value, set uptoken by result of op.uptoken_func
       var getUpToken = function(file) {
           if (op.uptoken) {
               that.token = op.uptoken;
               return;
           } else if (op.uptoken_url) {
               logger.debug("get uptoken from: ", that.uptoken_url);
               // TODO: use mOxie
               var ajax = that.createAjax();
               ajax.open('GET', that.uptoken_url, false);
               ajax.setRequestHeader("If-Modified-Since", "0");
               // ajax.onreadystatechange = function() {
               //     if (ajax.readyState === 4 && ajax.status === 200) {
               //         var res = that.parseJSON(ajax.responseText);
               //         that.token = res.uptoken;
               //     }
               // };
               ajax.send();
               if (ajax.status === 200) {
                   var res = that.parseJSON(ajax.responseText);
                   that.token = res.uptoken;
                   logger.debug("get new uptoken: ", res.uptoken);
               } else {
                   logger.error("get uptoken error: ", ajax.responseText);
               }
               return;
           } else if (op.uptoken_func) {
               logger.debug("get uptoken from uptoken_func");
               that.token = op.uptoken_func(file);
               logger.debug("get new uptoken: ", that.token);
               return;
           } else {
               logger.error("one of [uptoken, uptoken_url, uptoken_func] settings in options is required!");
           }
       };

通过npm安装

npm install qiniu-js

在项目中使用import引入

import 'qiniu-js/dist/qiniu.min.js';

html

<div id="container">
    <div id="pickfiles">上传按钮</div>
</div>

JavaScript

 var uploader = Qiniu.uploader({
     runtimes: 'HTML5,flash,html4',      // 上传模式,依次退化(照着官网来就是了)
     browse_button: 'pickfiles',         // 上传选择的点选按钮,必需(记得定义id并且保持一致)
     // 在初始化时,uptoken,uptoken_url,uptoken_func三个参数中必须有一个被设置
     // 切如果提供了多个,其优先级为uptoken > uptoken_url > uptoken_func
     // 其中uptoken是直接提供上传凭证,uptoken_url是提供了获取上传凭证的地址,如果需要定制获取uptoken的过程则可以设置uptoken_func
     uptoken : '<Your upload token>', // uptoken是上传凭证,由其他程序生成
     uptoken_url: '/uptoken',         // Ajax请求uptoken的Url,强烈建议设置(服务端提供)
     uptoken_func: function(){        // 在需要获取uptoken时,该方法会被调用
        // do something(一般是发送手动发送ajax获取到token,如果后端返回格式不跟官方一致又不想该懂源代码可以通过这个方式调整)
        return uptoken;
     },
     get_new_uptoken: false,             // 设置上传文件的时候是否每次都重新获取新的uptoken(没有特殊需求一般为false)
     // downtoken_url: '/downtoken',(未使用到,可以不设置)
     // Ajax请求downToken的Url,私有空间时使用,JS-SDK将向该地址POST文件的key和domain,服务端返回的JSON必须包含url字段,url值为该文件的下载地址
     // unique_names: true,              // 默认false,key为文件名。若开启该选项,JS-SDK会为每个文件自动生成key(文件名)
     // save_key: true,                  // 默认false。若在服务端生成uptoken的上传策略中指定了sava_key,则开启,SDK在前端将不对key进行任何处理
     domain: '<Your bucket domain>',     // bucket域名,下载资源时用到,必需(找后端拿)
     container: 'container',             // 上传区域DOM ID,默认是browser_button的父元素(如果不实现拖拽上传可以不设置)
     max_file_size: '100mb',             // 最大文件体积限制(可以调大)
     flash_swf_url: 'path/of/plupload/Moxie.swf',  //引入flash,相对路径(如果没用到flash上传的话可以不设置,一般支持html5上传的浏览器都不会用到它)
     max_retries: 3,                     // 上传失败最大重试次数(自动帮你续传分片)
     dragdrop: true,                     // 开启可拖曳上传(如果不实现拖拽上传可以不设置)
     drop_element: 'container',          // 拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传(如果不实现拖拽上传可以不设置)
     chunk_size: '4mb',                  // 分块上传时,每块的体积
     auto_start: true,                   // 选择文件后自动上传,若关闭需要自己绑定事件触发上传
     //x_vars : {                        // (未使用到,可以不设置)
     //    查看自定义变量
     //    'time' : function(up,file) {
     //        var time = (new Date()).getTime();
               // do something with 'time'
     //        return time;
     //    },
     //    'size' : function(up,file) {
     //        var size = file.size;
               // do something with 'size'
     //        return size;
     //    }
     //},
     init: {
         'FilesAdded': function(up, files) {
             plupload.each(files, function(file) {
                 // 文件添加进队列后,处理相关的事情
             });
         },
         'BeforeUpload': function(up, file) {
                // 每个文件上传前,处理相关的事情
                // (上传文件前做一些处理)
         },
         'UploadProgress': function(up, file) {
                // 每个文件上传时,处理相关的事情
                // (可以设置进度条信息)
         },
         'FileUploaded': function(up, file, info) {
                // 每个文件上传成功后,处理相关的事情
                // 其中info是文件上传成功后,服务端返回的json,形式如:
                // {
                //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
                //    "key": "Gogopher.jpg"
                //  }
                // 查看简单反馈
                // var domain = up.getOption('domain');
                // var res = parseJSON(info);
                // var sourceLink = domain +"/"+ res.key; 获取上传成功后的文件的Url
         },
         'Error': function(up, err, errTip) {
                //上传出错时,处理相关的事情
         },
         'UploadComplete': function() {
                //队列文件处理完毕后,处理相关的事情
         },
         'Key': function(up, file) {
             // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
             // 该配置必须要在unique_names: false,save_key: false时才生效
 
             var key = "";
             // do something with key here
             // (可以自定义key不设定默认是文件名)
             return key
         }
     }
 });
 
 // domain为七牛空间对应的域名,选择某个空间后,可通过 空间设置->基本设置->域名设置 查看获取
 
 // uploader为一个plupload对象,继承了所有plupload的方法

总结

由于本次项目中只涉及到大文件上传,没有图像处理等相关的api使用经验官方的案例就不多讲了。总结起来七牛云上传的套路就是后台为你提供uptoken或者获取uptoken的接口地址之后上传的时候要带上这个token。返回的字段最好是按照官方的格式来,如果不是的话也可以修改源代码或者在uptoken_func中手动获取,另外如果要修改上传的服务器也是要在qiniu.js中修改

    
   var qiniuUploadUrls = [
       // "http://upload.qiniu.com",
       // "http://up.qiniu.com",
       "修改成你需要的地址",
   ];

如果使用表单上传的话可以不引用任何插件,代码实现如下:

    <fORM id="testform" method="post" enctype="multipart/form-data">
            <input name="key" id="key" type="hidden" value="">
            <input name="token" type="hidden" id="token" value="">
            <input id="userfile" name="file" type="file" />
 
            <!-- take photo with phone -->
            <!-- <input id="userfile" name="file" accept="image/*" type="file" /> -->
 
            <!-- take video with phone -->
            <!-- <input id="userfile" name="file" type="file" accept="video/*"/> -->
 
            <input name="accept" type="hidden" />
        </form>

JS:

    upload() {
        const formdata = new FormData(document.getElementById('testform'));
        $.ajax({
            url: '上传的七牛云服务器,后端提供', // 'http://up.qiniu.com'
            method: 'post',
            success: function(data) {
                console.log(data);
            },
        })
        ...
    }

需要注意的是,每个input都需要定义好那么属性,并且token不能为空,需要提前通过ajax去后端获取或者使用后端给定的token否则上传会失败~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: vue实现大文件分片上传与断点续传到七牛云

本文链接: https://www.lsjlt.com/news/152788.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue实现大文件分片上传与断点续传到七牛云
    问题: 前段时间做视频上传业务,通过网页上传视频到服务器。 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题: 1、文件过大,超出服务端的请求...
    99+
    2022-11-13
  • vue怎么实现大文件分片上传与断点续传送
    本文小编为大家详细介绍“vue怎么实现大文件分片上传与断点续传送”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现大文件分片上传与断点续传送”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题:前段时间...
    99+
    2023-07-02
  • vue 大文件分片上传(断点续传、并发上传、秒传)
    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达...
    99+
    2022-11-13
  • springboot大文件上传、分片上传、断点续传、秒传的实现
    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达...
    99+
    2022-11-13
  • Vue实现大文件分片上传,包括断点续传以及上传进度条
    首先解释一下什么是分片上传         分片上传就是把一个大的文件分成若干块,一块一块的传输。这样做的好处可以减少重新上传的开销。比如:如果我们上传的文件是一个很大的文件,那么上传的时间应该会比较久,再加上网络不稳定各种因素的影响,很容...
    99+
    2023-09-27
    vue.js 前端 javascript
  • Vue 大文件上传和断点续传的实现
    目录文件上传的 2 套方案基于文件流(form-data)客户端把文件转换为 base64大文件上传获取到文件对象并转成 ArrayBuffer 对象创建切片发送请求所有切片发送成功...
    99+
    2022-11-12
  • Vue+Node实现大文件上传和断点续传
    目录源代码Blob.slice切片初始化文件内容FormData.append()大文件上传断点续传代码创建切片源码worker 线程通讯的逻辑断点续传秒传源代码 断点续传、分片上传...
    99+
    2022-11-13
  • React+Node实现大文件分片上传、断点续传秒传思路
    目录1、整体思路2、实现步骤2.1 文件切片加密2.2 查询上传文件状态2.3 秒传2.4 上传分片、断点续传2.5 合成分片还原完整文件3、总结4、后续扩展与思考5、源码1、整体思...
    99+
    2022-11-13
  • Vue+Node怎么实现大文件上传和断点续传
    本篇内容介绍了“Vue+Node怎么实现大文件上传和断点续传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!源代码断点续传、分片上传、秒传、重...
    99+
    2023-06-30
  • Java实现七牛云文件图片上传下载
    目录一、准备工作1.1.为什么选择七牛云?1.2.七牛云注册二、java操作七牛云对象存储下载2.1.pom.xml引入依赖2.2.上传下载具体代码三、具体业务例子(七牛云做...
    99+
    2022-11-12
  • 如何使用大文件上传:秒传、断点续传、分片上传方法
    本篇内容介绍了“如何使用大文件上传:秒传、断点续传、分片上传方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!秒传1、什么是秒传通俗的说,你...
    99+
    2023-06-15
  • Vue在大文件上传和断点续传的实现方法
    本篇内容主要讲解“Vue在大文件上传和断点续传的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue在大文件上传和断点续传的实现方法”吧!文件上传的 2 套方案基于文件流(form-da...
    99+
    2023-06-20
  • vue+element+oss实现前端分片上传和断点续传
    纯前端实现: 切片上传 断点续传 。断点续传需要在切上上传的基础上实现 前端之前上传OSS,无需后端提供接口。先上完整代码,直接复制,将new OSS里的参数修改成自己公司OSS相关...
    99+
    2022-11-12
  • JavaScript利用切片实现大文件断点续传
    目录什么是断点续传实现思路需要后端提供的api获取已经上传的切片上传切片合并切片前端代码细节实现HASH值的获取方法切片处理总体html结构使用axios发送请求整体逻辑和代码实现效...
    99+
    2022-11-13
  • java实现文件切片上传百度云+断点续传的方法
    前言: 本文代码通过dubbo进行远程调用的接口,如果不使用dubbo,直接将service放到你的service,并稍作修改,redis替换成自己封装的工具即可。下方代码有点多,但...
    99+
    2022-11-12
  • java如何实现文件切片上传服务器+断点续传
    这篇文章主要为大家展示了“java如何实现文件切片上传服务器+断点续传”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现文件切片上传服务器+断点续传”这篇文章吧。1.定义一个实体类用...
    99+
    2023-06-22
  • js自己实现一个大文件切片上传+断点续传的示例代码
    目录首先我们来分析一下需求一、 格式校验二、 文件切片三、 断点续传 + 秒传 + 上传进度PM:喂,那个切图仔,我这里有个100G的视频要上传,你帮我做一个上传后台,下班前给我哦,...
    99+
    2022-11-13
  • 【java】java实现大文件的分片上传与下载(springboot+vue3)
    文章目录 1.1 项目背景1.2 项目目标2.1 业务流程2.2 系统用例2.3 系统总体功能3.1 技术选型4.1 文件上传模块4.2 文件下载模块4.3 数据库设计5.1 大文件上传实现5.2 大文件下载实现 源码: htt...
    99+
    2023-08-16
    java spring boot spring vue
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作