pupload 文件分块 php,基于Plupload实现Base64分割的文件上传方案

标题:基于Plupload实现Base64分割的文件上传方案

关键词:文件上传、Base64、Plupload、Blob、分割上传

领域:Web前端

作者:孙振强

日期:2018-04-13

目录

背景

存在问题

2.1. 体积增加1/3

2.2. 大文件上传不稳定

方案思路

3.1. 将服务器端的上传限制调整至足够大。

3.2. 将Base64进行分段传输。

3.3. 将Base64转换回file对象,调用plupload进行上传。

具体实现

4.1. 将Base64文件转化为Blob对象

4.3. 调用plupload将file对象上传

参考资料

5.1. Base64转化为Blob,转化为File的参考文档

5.2. Plupload官方文档

5.3. Plupload中文文档

1. 背景

前端在进行图片上传的时候,有时候会有裁剪的需求,对于裁剪功能现在采用HTML5的canvas实现,处理后的图片为Base64格式,然后将将Base64内容直接提交给后端接口。

除此之外,普通上传采用统一的文件微服务,前端使用plupload插件进行文件的分割、进度、回调等,后端分片接收文件、合并、用fastdfs存储、返回相对路径。

2. 存在问题

背景所述的实现方案在使用的过程存在一定问题:

2.1. 体积增加1/3

Base64化图片后,体积增加1/3左右。

2.2. 大文件上传不稳定

大图片采用Base64单次传输会超过后端接口上传容量设置,并且网络的稳定性也会引起上传的不稳定。

3. 方案思路

重要的问题在2.2.,解决方案可以有以下几种:

3.1. 将服务器端的上传限制调整至足够大。

比如100M,但是这样不够规范和优秀。

3.2. 将Base64进行分段传输。

前端写一个Base64分割传输处理的模块,后端写一个Base64分段接收上传。比较科学,但工作量较大,前后端都需要修改,而且稳定性需要多次优化。

3.3. 将Base64转换回file对象,调用plupload进行上传。

这种方式最理想,因为将变化和工作量都限制在了一个小范围内。

并且plupload是比较完善、成熟的插件,稳定性比较好,后端的实现代码完全不需要修改。

4. 具体实现

本文将详述3.3.方案的具体实现。

4.1. 将Base64文件转化为Blob对象

/**

* Convert a base64 string in a Blob according to the data and contentType.

*

* @param b64Data {String} Pure base64 string without contentType

* @param contentType {String} the content type of the file i.e (image/jpeg - image/png - text/plain)

* @param sliceSize {Int} SliceSize to process the byteCharacters

* @see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript

* @return Blob

*/

function b64toBlob(b64Data, contentType, sliceSize) {

contentType = contentType || '';

sliceSize = sliceSize || 512;

var byteCharacters = atob(b64Data);

var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {

var slice = byteCharacters.slice(offset, offset + sliceSize);

var byteNumbers = new Array(slice.length);

for (var i = 0; i < slice.length; i++) {

byteNumbers[i] = slice.charCodeAt(i);

}

var byteArray = new Uint8Array(byteNumbers);

byteArrays.push(byteArray);

}

var blob = new Blob(byteArrays, {type: contentType});

return blob;

}

具体转化:

var ImageURL = "data:image/gif;base64,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";

// Split the base64 string in data and contentType

var block = ImageURL.split(";");

// Get the content type of the image

var contentType = block[0].split(":")[1];// In this case "image/gif"

// get the real base64 content of the file

var realData = block[1].split(",")[1];// In this case "R0lGODlhPQBEAPeoAJosM...."

// Convert it to a blob

var blob = b64toBlob(realData, contentType);

4.2. 将Blob对象转化为File对象

// Convert it to a blob

var blob = b64toBlob(realData, contentType);

// 转为File对象file

val file = new File([blob], "文件名.gif");

//对象信息如下:

//File

// lastModified: 1523531338900

// lastModifiedDate: Date 2018-04-12T11:08:58.900Z

// name: "文件名.gif"

// size: 1951

// type: "image/gif"

// webkitRelativePath: ""

4.3. 调用plupload将file对象上传

下面代码是实例化plupload,使用常规的方法即可,不清楚的同学请查阅5.中的plupload文档。

var uploader = new plupload.Uploader({

runtimes: 'html5,flash,silverlight,html4',

browse_button: 'input_file', //触发文件选择对话框的按钮,为那个元素id

url: upload_url, //服务器端的上传页面地址

chunk_size: '512kb', //割成的大小

max_file_size: '20mb', //最大只能上传1gb的文件

},

init: {

FilesAdded: function (up, files) {

//此处可以做选择文件后的处理

uploader.start();

},

UploadProgress: function () {

//上传过程处理

},

Error: function (up, err) {

$('#input_file').removeAttr('disabled');

if (err.code == '-601') {

$('.error_message').text('请上传图片格式文件!');

} else if (err.code == '-602') {

$('.error_message').text('对不起,此文件刚才已选择上传了。');

} else {

$('.error_message').text('上传文件错误:' + err.code);

}

},

FileUploaded: function (up, file, result) {

//result.response

//上传完成后续处理

}

}

});

下面的代码才是重点,通过plupload进行上传:

//此处uploader为刚才定义的plupload实例,file为base64转化后的对象

uploader.addFile(file);

uploader.start();

大功告成,具体你就来动手实现吧。

5. 参考资料

5.1. Base64转化为Blob,转化为File的参考文档

How to convert a base64 image into a image file and upload it with an asynchronous form using jQuery

5.2. Plupload官方文档

5.3. Plupload中文文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php imagick手册,PHP中使用Imagick实现各种图片效果实例

这篇文章主要介绍了PHP中使用Imagick实现各种图片效果实例,本文讲解了偏置图像、改变图片大imagick是一个功能强大的图像处理库。说是翻译 其实就是简要介绍imagick 的主要功能的或者说是我觉得比较实用的功能函数的介绍 以及使用的例子。因为本人的英语水平有限&#xff0c;所…

php流程控制的类型有哪些,流程控制包括哪些内容

流程控制也称为控制流程&#xff0c;是计算机运算领域的用语&#xff0c;其内容包括在程序运行时&#xff0c;个别的指令或是陈述、子程序运行或求值的顺序&#xff0c;不论是在声明式编程语言或是函数编程语言中&#xff0c;都有类似的概念。控制流程(也称为流程控制)是计算机…

PHP公鸡五文钱,公鸡

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”&#xff0c;鸡翁一&#xff0c;值钱五&#xff0c;鸡母一&#xff0c;值钱三&#xff0c;鸡雏三&#xff0c;值钱一&#xff0c;百钱买百鸡&#xff0c;问翁、母、雏各几何&#xff1f;实现过程&#…

oracle11g创建闪回分区多大,Oracle闪回区大小预估

一个朋友问如何设置Oracle闪回区大小&#xff0c;有什么依据没有。查证官方文档&#xff0c;有如下描述For example, if you intend to setDB_FLASHBACK_RETENTION_TARGET to 24 hours, and if the database generates 20 GB of redo in a day, then a rule of thumb is to all…

平方变换法提取载波MATLAB,毕业设计(论文)MPSK信号的载波同步算法研究与仿真.doc...

目录摘要IAbstractII第一章 绪论1相移键控技术1第二章 载波同步原理22.1平方变换法和平方环法22.2 同相正交3第三章 相移键控(PSK)信号的调制原理63.1 二进制相移键控的基本原理63.2 二进制差分相移键控(DPSK)的基本原理83.3 多进制相移键控(MPSK)的基本原理113.3.1 QPSK调制原…

oracle dba_waiters中的lockid是什么,查杀oracle lock session and table

查杀oracle 死锁的一些帖子摘录[more]查找死锁进程column sid format 999;column b format 9;column object_name format a30;select v$lock.sid,decode(v$lock.type,MR, Media Recovery,RT,Redo Thread,UN,User Name,TX, Transaction,TM, DML,UL, PL/SQL User Lock,DX, Distri…

查询linux服务器事物传输失败日志,查看fail2ban日志代替lastb查看登录失败记录

之前我曾经用shell脚本提取lastb登录失败超过指定次数的IP加入到iptables&#xff0c;来禁止这些IP登录主机&#xff0c;达到防止恶意攻击的目的。后来为了给主机提供更全面的防护&#xff0c;又安装了fail2ban。今天早上我收到fail2ban发过来的报警邮件提示我禁止了一个IP登录…

文件字符串变量插入linux,Linux Shell脚本实现在文件指定的行插入字符串

涉及知识点&#xff1a;grep字符串查找&#xff0c;awk截取列&#xff0c;until条件操作&#xff0c;sed字符串插入&#xff0c;变量与字符串连接等。人工操作(首先vim打开文件找到字符串所在的位置&#xff0c;插入操作)&#xff1a;vim /etc/glance/glance-api-paste.ini# Li…

linux系统子接口配置文件,Linux网卡绑定、子接口-IP别名

查看网卡线缆状态&#xff1a;mii-tool eth0查看网卡底层信息&#xff1a;ethtool eth0ethtool -i eth0 查看网卡驱动信息ethtool -S eth0 查看网卡状态统计信息Linux下可以通过IP别名(子接口)功能为一个物理网卡添加多个IP地址要使用IP别名(子接口)需要关闭NetworkManager服…

linux防火墙允许dns服务,Linux防火墙设置-DNS服务器篇

亲测可用&#xff0c;对于刚刚搭建了DNS服务器&#xff0c;需要开启防火墙但又不知道该怎么设置的朋友&#xff0c;可以参考下面的内容&#xff0c;或者直接使用我下面给出的脚本程序。如果服务器是作为DNS服务器使用的&#xff0c;针对绝大多数的情况&#xff0c;为了开启防火…

发布react项目到linux服务器,nginx上部署react项目的实例方法

测试项目&#xff1a;react-demo克隆你的react-demo项目到服务器上(默认使用Github管理我们的项目)如果需要&#xff0c;请安装项目环境&#xff0c;比如&#xff1a;node.js&#xff0c;yarn等进入项目目录&#xff0c;执行npm run build&#xff0c;开始构建项目构建成功之后…

linux取消线程的原理,浅析 Linux 进程与线程

简介进程与线程是所有的程序员都熟知的概念&#xff0c;简单来说进程是一个执行中的程序&#xff0c;而线程是进程中的一条执行路径。进程是操作系统中基本的抽象概念&#xff0c;本文介绍 Linux 中进程和线程的用法以及原理&#xff0c;包括创建、消亡等。进程创建与执行Linux…

linux查看注册表信息,linux下登录档及其查看方法

一、Linux 常见的登录档档名登录档可以帮助我们瞭解很多系统重要的事件&#xff0c;包括登入者的部分资讯&#xff0c;因此登录档的权限通常是设定为仅有 root 能够读取而已。 而由于登录档可以记载系统这麽多的详细资讯&#xff0c;所以啦&#xff0c;一个有经验的主机管理员会…

Linux系统openssl升级,在Linux系统上升级OpenSSL的方法

我是用的centos &#xff0c;目前官方说受威胁的版本是1.0.1f, 1.0.1e, 1.0.1d, 1.0.1c, 1.0.1b, 1.0.1a, 1.0.1 。在openssl 1.0.1g版本中“ heartbleed”漏洞被修复。所有centos6.5的系统运行openssl 1.0.1e (openssl-1.0.1e-16.el6_5.4) 都会受到威胁&#xff0c;貌似只有6.…

linux系统建立文件系统,linux文件系统的建立

1根文件系统嵌入式Linux中都需要构建根文件系统&#xff0c;构建根文件系统的规则在FHS(Filesystem HierarchyStandard)文档中&#xff0c;下面是根文件系统顶层目录。目录内容bin存放所有用户都可以使用的、基本的命令。sbin存放的是基本的系统命令&#xff0c;它们用于启动系…

linux防火墙配置管理,Linux之Iptables防火墙管理与配置 -电脑资料

基本语法格式&#xff1a;iptables [ –t 表名 ] 命令选项 [ 链名 ] [ 条件匹配 ] [ –j 目标动作或跳转 ]Tip&#xff1a;若不指定表名&#xff0c;默认使用filter表&#xff0c;常用选项&#xff1a;-A&#xff1a;在指定链的末尾添加( –append )一条新规则。-D&#xff1a;…

linux双屏播放视频,Ubuntu Linux下双屏显示解决方案

Ubuntu从起后居然把Windows的设置给记住了。显示ok。我晕。以前倒是也有过这问题&#xff0c;在双系统情况下&#xff0c;外接键盘的灯会继承Windows的早就有心弄个显示器&#xff0c;把笔记本的外接上&#xff0c;倒不是说非要2个屏幕来工作如何如何&#xff1f;只是因为我的本…

d630 无线驱动 linux,fedora 8下DELL D630无线网卡驱动的安装

fedora 8下DELL D630无线网卡驱动的安装发布时间:2007-11-19 01:53:26来源:红联作者:Cantonese作者是dypang我的电脑是 DELL D630&#xff0c;无线网卡型号为 DELL wireless 1390 mini card。F8在 D630 上安装是很容易的&#xff0c;只是无线网卡的按照颇费了些周折。以下是我装…

鸟哥linux群,【鸟哥的linux私房菜-学习笔记】linux的帐号与群组

linux的帐号与群组使用者标识符&#xff1a; UID 与 GIDID 与账号的对应就在 /etc/passwd 当中&#xff1b;计算机只认得ID(即数字)&#xff0c;并不能区别账号&#xff1b;每个登陆的使用者至少都会取得两个 ID &#xff0c;一个是使用者 ID (User ID &#xff0c;简称 UID)、…