前端vue大文件分片上传,

  前端vue大文件分片上传,

  本文介绍了vue分片上传大文件,并在断点处继续传输给七牛云的方法,通过示例代码详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

  

问题:

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

  视频大小从几十米到1G不等。如果通过一般的HTTP请求发送数据,会遇到以下问题:

  1.文件太大,超过了服务器的请求大小限制。2.请求时间太长,请求超时;3.传输中断,必须重新上传,导致之前的所有努力都白费了;

探索过程:

  1.之前咨询过群里的大佬,给我推荐过百度的webupload,但是介绍完之后发现是基于jquery封装的。因为项目本身是基于vue开发的,所以尽量不考虑jquery相关的开源框架。

  2.查阅资料后,手动实现了上传文件切片到服务器的基本需求。但是由于效率和稳定性的问题,我决定直接把文件转到七牛云。一开始我是用表单上传的方式来实现的。后来各种原因让我分片上传。

  3.介绍一下七牛的jssdk。

  

解决方案:

  1.修改服务器上传的限制配置;Nginx和PHP的上传文件限制不要太大,一般5M左右比较好;2.大文件碎片化,一个一个传到服务器,再由服务器合并。这样做的好处是,一旦上传失败,只会丢失一个片段,不会重传整个文件。而且每个碎片的大小可以控制在4MB以内,服务器可以限制在4 M. 3。用七牛JavaScript SDK分块上传。

  首先,当我们刚接触一项新技术的时候,我们先绕着官方文档了解一下基本用法~

  文档地址:JavaScript SDK

  Qiniu-JavaScript-SDK是客户端SDK,不包含令牌生成实现。出于安全考虑,建议通过网络从服务器获取令牌。有关生成的特定代码,请参考server SDK文档。

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

功能简介

  上传大于4M时可以分块上传,上传小于4M时支持断点续传(图片)imageView2(缩略图)imageMogr2(高级处理,包括缩放、裁剪、旋转等。)imageInfo(获取基本信息)exif(获取图片EXIF信息)watermark(文本,图片水印)pipeline(管道,可以链式处理imageView2,imageMogr2,watermark)后端返回给你的获取令牌的json格式必须是这个格式。它必须是内部包装了uptoken字段的json对象。也可以带其他字段,但是必须在第一层找到uptoken。

  {

  uptoken : 0 mlwpnyya 1 wtpnxfy 9 klyghyfpndzceoml . ,

  xxx : .

  }

  因为token就是这样在其sdk源代码中获得的。他将首先发现在定义的选项字段中是否有uptoken。如果没有uptoken_url,他将发送ajax请求来获取uptoken字段。如果后端一定要基于他的格式,可以修改sdk源代码来实现。如果uptoken_url没有值,返回并调用uptoken_func函数。如果没有一个函数有任何值,将会报告一个错误,因此必须指定这三个函数中的一个。

  //getUptoken可能在Init事件或BeforeUpload事件中调用

  //case Init事件,getUptken的文件参数将被设置为空值

  //如果op.uptoken有值,用op.uptoken设置uptoken

  //否则如果op.uptoken_url有值,从op.uptoken_url设置uptoken

  //否则如果op.uptoken_func有值,由op.uptoken_func的结果设置uptoken

  var getUpToken=function(file) {

  if (op.uptoken) {

  that . token=op . up token;

  返回;

  } else if (op.uptoken_url) {

  logger.debug(get uptoken from:,that . up token _ URL);

  //TODO:使用莫邪

  var Ajax=that . create Ajax();

  ajax.open(GET ,that.uptoken_url,false);

  Ajax . setrequestheader( If-Modified-Since , 0 );

  //Ajax . onreadystatechange=function(){

  //if(Ajax . ready state===4 Ajax . status===200){

  //var RES=that . parse JSON(Ajax . responsetext);

  //that . token=RES . up token;

  //}

  //};

  Ajax . send();

  if (ajax.status===200) {

  var RES=that . parse JSON(Ajax . responsetext);

  that . token=RES . up token;

  logger.debug(get new uptoken:,RES . up token);

  }否则{

  logger.error(get uptoken error:,Ajax . responsetext);

  }

  返回;

  } else if (op.uptoken_func) {

  logger . debug( get up token from up token _ func );

  that . token=op . up token _ func(file);

  logger.debug(get new uptoken:,that . token);

  返回;

  }否则{

  logger.error(需要选项中的[uptoken,uptoken_url,uptoken_func]设置之一!);

  }

  };

  通过npm安装

  npm安装qiniu-js

  在项目中导入。

  导入 qiniu-js/dist/qiniu . min . js ;

  

HTML

  div id=容器

  Div id=pickfiles 上传按钮/div

  /div

  

JavaScript

  var uploader=Qiniu.uploader({

  运行时: HTML5,Flash,HTML4 ,//上传模式,依次降级(只需关注官网)

  Browse_button: pickfiles ,//上传选中的点击按钮,必选(记得定义id并保持一致)

  //初始化时,必须设置uptoken、uptoken_url和uptoken_func三个参数中的一个。

  //如果提供了多个,则其优先级为uptoken uptoken_url uptoken_func

  //其中uptoken直接提供上传凭证,uptoken_url提供获取上传凭证的地址。如果需要自定义获取uptoken的过程,可以设置uptoken_func。

  Uptoken: YourUploadToken ,//Uptoken是上传凭证,由其他程序生成。

  Uptoken _ url:“/up token”,//Ajax请求up token的Url。强烈建议设置它(由服务器提供)

  Uptoken_func: function(){ //需要获取Uptoken时会调用这个方法。

  //做点什么(一般可以手动发送ajax来获取令牌。如果后端返回格式与官方格式不一致,又不想知道源代码,可以这样调整)

  返回uptoken

  },

  Get_new_uptoken: false,//设置每次上传文件时是否重新获取一个新的uptoken(无特殊要求一般为false)

  //down token _ URL:“/down token”,(不用,可以设置)

  //Ajax请求downToken的Url,在私有空间使用。JS-SDK会将文件的密钥和域发送到这个地址。服务器返回的JSON必须包含url字段,url值就是文件的下载地址。

  //unique_names:默认为true,//false,key为文件名。如果打开这个选项,JS-SDK将自动为每个文件生成密钥(文件名)。

  //save_key:默认为true,//false。如果服务器端生成uptoken的上传策略中指定了sava_key,则开启,SDK不会在前端处理该key。

  域:‘你的桶域’,//桶域名,下载资源时需要(找后端获取)

  Container: container ,//上传区域DOM ID,默认为browser_button的父元素(如果没有实现拖放上传,可以不设置)

  Max_file_size: 100mb ,//最大文件大小限制(可以扩大)

  flash _ SWF _ URL: path/of/plo upload/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();

  //用“时间”做点什么

  //返回时间;

  //},

  //size : function(up,file) {

  //var size=file . size;

  //用“大小”做一些事情

  //返回大小;

  //}

  //},

  初始化:{

   FilesAdded: function(up,files) {

  plupload.each(文件,函数(文件){

  //文件加入队列后,处理相关的事情。

  });

  },

  上传前:函数(上传,文件){

  //每个文件上传之前,处理好相关的事情。

  //(在上传文件之前做一些处理)

  },

   UploadProgress :函数(up,file) {

  //每个文件上传的时候,处理相关的事情。

  //(可以设置进度条信息)

  },

   FileUploaded :函数(up,file,info) {

  //每个文件上传成功后,处理相关的事情。

  //其中info是文件上传成功后服务器返回的json,格式为:

  //{

  // hash : fh8 xvqod 2 MQ 1 mocfi 4s 4k PRL 6d 98 ,

  //key: gogopher.jpg

  //}

  //检查简单的反馈

  //var domain=up . get option( domain );

  //var RES=parse JSON(info);

  //var source link=domain / RES . key;获取成功上传的文件的Url。

  },

   Error :函数(up,err,errTip) {

  //上传出现错误时,处理相关事情。

  },

   UploadComplete :函数(){

  //队列文件处理完后,处理相关的事情。

  },

  键:功能(向上,文件){

  //如果想在前端个性化每个文件的密钥,可以配置这个功能

  //此配置必须在unique_names: false和save_key: false时生效。

  var key=“”;

  //在这里用键做一些事情

  //(您可以在不设置默认文件名的情况下自定义密钥)

  回车键

  }

  }

  });

  //domain是七牛空间对应的域名。选择空间后,可以通过空间设置-基础设置-域名设置查看。

  //uploader是一个plupload对象,它继承了所有的plupload方法。

  

总结

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

  /**

  *奇牛上传网址

  * qiniuUploadUrls 用于在当前url不可用时更改目标

  * @type {Array}

  */

  var qiniuploadurls=[

  //http://upload.qiniu.com ,

  //http://up.qiniu.com ,

  将其修改为您需要的地址,

  ];

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

  form id= test form method= post enctype= multipart/form-data

  输入名称= key id= key type= hidden value=

  输入name= token type= hidden id= token value=

  输入id= user file name= file type= file /

  !-用手机拍照-

  !-input id= user file name= file accept= image/* type= file /-

  !-用手机拍视频-

  !-input id= user file name= file type= file accept= video/* /-

  输入名称=接受类型=隐藏/

  /表单

  JS:

  上传(){

  const FormData=new FormData(document . getelementbyid( test form );

  $.ajax({

  网址:上传七牛云服务器,后端提供,//http://up.qiniu.com

  方法: post ,

  成功:函数(数据){

  console.log(数据);

  },

  })

  .

  }

  需要注意的是,每个输入的属性都需要定义,令牌不能为空。需要提前通过ajax从后端获取令牌或者使用后端给的令牌,否则上传会失败~

  这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: