Thinkphp + Layui 的大文件带进度条的上传

本文介绍如何使用Layui实现大文件上传功能,包括前端界面设计、JS交互逻辑及PHP后端处理。适用于网速较快场景下的大文件上传需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:优美界面,直接能够用在生产当中的大文件上传代码


前言

提示:网络时代的变化,网速的加快,对于大文件的上传下载都有了更高的需求。但是,发现没有一个比较好看,讲解清晰的thinkphp 大文件上传的教程。


一、前端Layui 的上传模块实现

注:需要引入layui,如果要带进度条的话,layui的版本必须是2.5.5版本以上才能够支持。
使用layui的上次模块进行文件上传时,有一个弊端就是上传的文件一定不能超过php.ini中的单个文件上传大小的限制,如果超过了限制的大小则服务器端无法获取到上次的文件。

1、html代码

直接上代码:

<div class="wrap js-check-wrap">
        <div class="layui-upload" style="margin-top: 50px;">
            <div class="layui-card" style="height: 120px;padding: 20px;">
                
                <div class="xzwj">
                    <button type="button" class="layui-btn layui-btn-primary" id="test8">选择文件</button>
                </div>
                <div class="layui-progress" lay-filter="demo" lay-showPercent="yes"
                    style="width: 300px;margin: 30px 0 10px 0;">
                    <div class="layui-progress-bar" lay-percent="0%"></div>
                </div>
                <div>
                    <button style="display: none;" type="button" class="layui-btn" id="test9">开始上传</button>
                    <input type="hidden" name="">
                </div>
            </div>
        </div>
    </div>

2、JS代码

		var upload = '';
        var element = '';

        layui.use(['upload', 'element'], function () {
            upload = layui.upload;
            element = layui.element;

            //选完文件后不自动上传
            upload.render({
                elem: '#test8',
                url: '{:U("upload")}',
                auto: false,
                accept: 'video',
                exts: 'mp4',
                bindAction: '#test9',
                choose: function (obj) {
                    var name = $('.layui-upload-file').val();
                    $('.xzwj').append("<span style='padding-left:20px'>"+name+"</span>");
                    $('#test9').show();
                    element.progress('demo', '0%');
                },
                before: function (obj) {
                    layer.load(1, { shade: '#fff' });
                },
                progress: function (n, elem) {
                    var percent = n + '%' //获取进度百分比
                    element.progress('demo', percent); //可配合 layui 进度条元素使用
                },
                done: function (res) {
                    layer.closeAll();
                    layer.msg('上传成功');
                    $('#test9').hide();
                },
                error: function () {
                    console.log('上传失败');
                }
            });

        });

效果如下图:

上传文件效果图

上传成功后

3、PHP 代码

在thinkphp下的上传文件代码:

public function upload(){
	$upload = new \Think\Upload(); // 实例化上传类
	$upload->maxSize   =     314572800; // 设置附件上传大小
	$upload->exts      =     array('mp4'); // 设置附件上传类型
	$upload->rootPath  =     './Uploads/'; // 设置附件上传根目录
	$upload->savePath  =     ''; // 设置附件上传(子)目录
	// 上传文件 
	$info   =   $upload->upload();
	
	$pathinfo = $upload->rootPath .$info['savepath'].$info['savename'];
	
	if (!$info) { // 上传错误提示错误信息
		echo json_encode(['status'=>'201','info'=>$upload->getError()]);
	} else { // 上传成功
		echo json_encode(['status'=>'200','info'=>$pathinfo]);
	}
}

总结

总体来说,Layui的使用还是比较简单的,再加上PHP框架的加持,写一个上传功能用不了多复杂。但是layui没有进行分片上传的封装,目前只能是按照一个文件来上传,目前适合上传一些图片、小的文件、视频。对于大的视频、文件的话建议使用分片上传。下期来介绍一个分片上传的实例。

<think>嗯,用户想用Layui实现多文件一次性上传并存储到系统目录。我需要先回顾一下Layui上传组件怎么用。记得Layuiupload模块需要配置elem、url、accept等参数。多文件上传的话应该要设置multiple:true。 然后前端部分,用户需要选择多个文件,可能需要绑定一个按钮,用upload.render方法。上传的url要指向后端处理接口,比如PHP的TP5或者Spring Boot。后端接收文件的时候要注意处理多个文件,可能用循环遍历$_FILES数组。 存储路径方面,后端需要指定系统目录,并确保有写入权限。比如PHP中使用move_uploaded_file函数,Java可能用transferTo方法。还要考虑文件名的处理,避免重复,可以用时间戳或哈希值重命名。 另外用户提到的引用里有配置上传大小限制,比如PHPupload_max_filesize和post_max_size,Spring Boot的maxFileSize和max-request-size,这些都需要在后端配置好,防止大文件上传失败。 安全方面,要限制文件类型,检查MIME类型或后缀名,防止上传恶意文件。前端Layui的accept参数可以设置允许的文件类型,比如'file'或者具体扩展名。 可能还需要处理上传进度显示和成功后的回调,比如在done里更新UI,显示上传成功的文件信息。错误处理也要做,比如网络问题或服务器错误,用error回调提示用户。 用户可能需要完整的代码示例,所以得提供前后端的代码片段,比如HTML里写LayuiJS配置,PHP或Java的后端处理逻辑。同时要强调目录权限和配置修改,确保用户在实际部署时不会遇到权限问题或配置错误。 最后,相关问题可以扩展到性能优化、分片上传进度条实现,或者与其他框架整合,比如ThinkPHP或Spring Boot,这些都是用户可能后续会问到的点。</think>### 分步实现Layui多文件上传存储系统目录 #### 一、前端Layui配置 1. **HTML元素绑定**:创建上传按钮容器 ```html <div class="layui-upload"> <button type="button" class="layui-btn" id="uploadBtn">选择多文件</button> </div> ``` 2. **JavaScript核心配置**(需引入Layui.js) ```javascript layui.use('upload', function(){ var upload = layui.upload; upload.render({ elem: '#uploadBtn', url: '/upload', // 后端接口地址 accept: 'file', multiple: true, // 开启多选 auto: false, // 关闭自动上传 bindAction: '#submitBtn', // 绑定提交按钮 choose: function(obj){ obj.preview(function(index, file, result){ console.log('已选择文件:', file.name); }); }, done: function(res){ if(res.code == 0){ layer.msg('上传成功'); } }, error: function(){ layer.msg('上传失败'); } }); }); ``` #### 二、后端处理逻辑(以PHP为例) 1. **接收文件处理** ```php public function upload(){ $files = request()->file(); foreach($files as $file){ $savePath = '/upload/'.date('Ymd'); $info = $file->validate(['size'=>10485760])->move(ROOT_PATH.$savePath); if($info){ $fullPath = $savePath.'/'.$info->getSaveName(); // 记录到数据库... } } return json(['code'=>0, 'msg'=>'上传完成']); } ``` #### 三、关键配置项说明 1. **PHP配置调整**(php.ini): ``` upload_max_filesize = 100M post_max_size = 100M max_file_uploads = 20 ``` 2. **Spring Boot配置**(application.properties): ```properties spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=100MB ``` #### 四、安全增强建议 1. 文件类型验证: ```javascript // 前端限制 acceptMime: 'image/*,application/pdf' // 后端验证(PHP) $file->validate(['ext'=>'jpg,png,pdf']) ``` 2. 文件重命名策略: ```php $filename = md5(uniqid()).'.'.$file->extension(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stephen_112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值