php多文件上传方法+js限制上传文件大小
最近遇到php网站上传文件需求,需要单次上传多个文件,由于php有上传文件大小限制,服务端检测文件大小功能是在上传之后才检测,超过限制就会上传失败,而且浪费上传时间和流量。因此需要前端检测并限制上传大小。
工具/原料
php
代码编辑器
一、多文件选择
1、网上的帖子大部分说php无法多文件上传,主要原因是<input type=file>标签默认一次只能选择一个文件,其实 HTML5 的 input 标签添加 multiple 属性就可以支持多文件选择。代码如下:<form id="up" action="upload_file.php" method="post" enctype="multipart/form-data"><input type="file" name="file" multiple="multiple"/></form>
2、需要把 input 的name属性设置为数组才能被php正确识别;<input type="file" name="file[]" multiple="multiple" />
3、顺便添加accept属性,限制上传文件类型。<input type="file" name="file[]" multiple="multiple" accept="image/*" />
二、获取并限制上传文件大小
1、在<script>中用js代码获取选择的文件大小比较复杂,应该给input标签的change事件绑定函数,用this.files[0].size直接传递文件大小,代码如下:<input type="file" name="file[]" multiple="multiple" onchange="filesize(this.files)" /><script>function filesize(files){alert("文件大小是"+files[0].size)}</script>
2、由于是选择多个文件,应使用this.files.length获取选择的文件数量,然后用for循环使用下标获取每个文件的大小,累加计算选择的总文件大小:var t=0; //记录文件累加大小。for(i=0;i<files.length;i++){t+=files[i].size;}
3、判断 t 值是否超过限制,这里直接获取的size是字节值,如果我们限制的文件大小是10MB,可以使用t/1024/1024把字节值换算成MB,然后进行比较,如果超过限制,则弹出提示并重置表单。代码如下:var t=0; //记录文件累加大小。for(i=0;i<files.length;i++){t+=files[i].size;}t=t/1024/1024;if(t>10){alert("文件大小超过限制,请重新选择。");document.getElementById("up").reset()}
三、上传文件
1、在php代码中,用“count($_FILES['file'][&拭貉强跳#39;name'])”获取选择的文件数量,使用下标获取每个文件名,如:$_F朐袁噙岿ILES['file']['name'][0]表示第一个文件。使用for循环上传每个文件到upload文件夹:for($i=0;$i<count($_FILES['file1']['name']); $i++){move_uploaded_file($_FILES["file"]["tmp_name"][$i],"upload/" . $_FILES["file"]["name"][$i])}
完整代码
1、上传表单:<html><meta name="viewport" content="width=device-width, initial-scale=1.0"><body><formid="up"action="upload_file.php" method="post" enctype="multipart/form-data"><input type="file" name="file[]" multiple="multiple"accept="image/*" onchange="filesize(this.files)"/><input type="submit" value="上传" /></form><script>function filesize(files)var t=0; //记录文件累加大小。for(i=0;i<files.length;i++){t+=files[i].size;}t=t/1024/1024;if(t>10){alert("文件大小超过限制,请重新选择。");document.getElementById("up").reset()}</script></body></html>
2、php代码:<?phpfor猾诮沓靥($i=0;$i<count($_FILES['file1']['name']); $i++){move_uploaded_file($_FILES["file"]["tmp_name"][$i],"upload/" . $_FILES["file"]["name"][$i])}echo "<br />" .$_FILES["file"]["name"][$i] . "上传成功<br />"; echo "类型:" . $_FILES["file"]["type"][$i] . "<br />"; echo "大小: " . ($_FILES["file"]["size"][$i] / 1024) . " Kb<br />"; echo "保存在: <a href='upload'><b>upload</b></a>文件夹。<br />";?>