当前位置:首页 > Web开发 > 正文

此时上传时刷新页面或者关闭浏览器

2024-03-31 Web开发

比来遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传成果,因此在此整理前端大文件上传相关成果的实现。

在某些业务中,大文件上传是一个对照重要的交互场景,如上传入库对照大的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