此时上传时刷新页面或者关闭浏览器
比来遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传成果,因此在此整理前端大文件上传相关成果的实现。
在某些业务中,大文件上传是一个对照重要的交互场景,如上传入库对照大的Excel表格数据、上传影音文件等。如果文件体积对照大,或者网络条件欠好时,上传的时间会对照长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心期待请求完成。
下面从文件上传方法入手,整理大文件上传的思路,并给出了相关实例代码,由于PHP内置了对照便利的文件拆分和拼接要领,因此处事端代码使用PHP进行示例编写。
本文相关示例代码位于github上,主要参考
聊聊大文件上传
大文件切割上传
文件上传的几种方法
首先我们来看看文件上传的几种方法。
普通表单上传
使用PHP来展示通例的表单上传是一个不错的选择。首先构建文件上传的表单,并指定表单的提交内容类型为enctype="multipart/form-data",表白表单需要上传二进制数据。
然后编写index.php上传文件接收代码,,使用move_uploaded_file要领即可(php大法好…)
form表单上传大文件时,很容易遇见处事器超时的问题。通过xhr,前端也可以进行异步上传文件的操纵,一般由两个思路。
文件编码上传
第一个思路是将文件进行编码,然后在处事端进行解码,之前写过一篇在前端实现图片压缩上传的博客,其主要实现道理就是将图片转换成base64进行通报
varimgURL = URL.createObjectURL(file);
ctx.drawImage(imgURL, 0, 0);
// 获取图片的编码,然后将图片当做是一个很长的字符串进行通报
vardata= canvas.toDataURL( "image/jpeg", 0.5);
在处事端需要做的工作也对照简单,首先解码base64,然后生存图片即可
$imgData = $_REQUEST[ ‘imgData‘];
$base64 = explode( ‘,‘, $imgData)[ 1];
$img = base64_decode($base64);
$url = ‘./test.jpg‘;
if(file_put_contents($url, $img)) {
exit(json_encode( array(
url => $url
)));
}
base64编码的错误谬误在于其体积比原图片更大(因为Base64将三个字节转化成四个字节,因此编码后的文本,会比原文本大出三分之一摆布),对付体积很大的文件来说,上传和解析的时间会明显增加。
更多关于base64的常识,可以参考Base64条记。
除了进行base64编码,还可以在前端直接读取文件内容后以二进制格局上传
// 读取二进制文件
functionreadBinary(text){
vardata = newArrayBuffer(text.length);
varui8a = newUint8Array(data, 0);
for( vari = 0; i < text.length; i++){
ui8a[i] = (text.charCodeAt(i) & 0xff);
}
console.log(ui8a)
}
varreader = newFileReader;
reader. = function{
readBinary( this.result) // 读取result或直接上传
}
// 把从input里读取的文件内容,放到fileReader的result字段里
reader.readAsBinaryString(file);
formData异步上传
FormData东西主要用来组装一组用 发送请求的键/值对,可以越发灵活地发送Ajax请求。可以使用FormData来模拟表单提交。
letfiles = e.target.files // 获取input的file东西
letformData = newFormData;
formData.append( ‘file‘, file);
axios.post(url, formData);
处事端措置惩罚惩罚方法与直接form表单请求基真不异。
iframe无刷新页面
在低版本的浏览器(如IE)上,xhr是不撑持直接上传formdata的,因此只能用form来上传文件,而form提交自己会进行页面跳转,这是因为form表单的target属性导致的,其取值有
_self,默认值,在不异的窗口中打开响应页面
_blank,在新窗口打开
_parent,在父窗口打开
_top,在最顶层的窗口打开
framename,在指命名字的iframe中打开
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31415.html