tp5+layui를 사용한 대용량 파일 업로드 소개
파일 업로드 크기를 변경하려면 먼저 일부 구성 정보를 기록해 주세요.
php.ini 열기#🎜 ###### 🎜🎜#FILE_UPLOADS = ON // http를 통해 파일의 스위치를 업로드하고 ##의 경로를 열 수 있는지 여부 🎜🎜UPLOAD_TMP_DIR // 임시 파일
🎜🎜upload_max_filesize 20M //업로드 가능한 최대 파일 크기
post_max_size 22M //POST 양식을 통해 업로드할 수 있는 크기
max_execution_time 600 / /단일 PHP 페이지를 실행할 수 있는 최대 시간
max_input_time 단일 PHP 페이지가 데이터를 수신하는 데 필요한 최대 시간, 기본값은 최대 메모리 60초, 기본값은 8M
위 구성을 변경하여 허용되는 파일 업로드 크기를 조정할 수 있습니다. (일부는 서버의 일부 구성을 조정해야 함) Additional: 413 error 서버가 nginx인 경우 nginx_conf 구성에서 client_max_body_size 24M을 변경하여 전송된 패킷을 수신하는 최대값을 설정해야 합니다. 클라이언트에 의해. http에 넣고, 서버를 다시 시작하고, 다시 시작을 사용하고, 다시 로드를 사용하지 마세요. 그럼 파일 분할 업로드를 시작해 보세요.
파일은 HTML의 파일 입력 태그를 통해 업로드됩니다. H5를 통해 새로운 객체 FileReader. 문자 그대로의 의미와 마찬가지로 FileRaeder 개체는 로컬 파일을 읽는 개체입니다. FileReader 개체는 로컬 파일을 읽고 base64 인코딩으로 반환할 수 있습니다. (FileReader 개체 사용에 대한 구체적인 내용은 Baidu를 참조하거나 매우 구체적인 다음 블로그 게시물을 읽어보십시오. 시도
입력 파일 태그를 통해 파일 선택
# 🎜🎜#FileReader 객체를 사용하여 파일 읽기파일의 base64 인코딩을 ajax를 통해 비동기적으로 전송합니다. 이를 수신한 후 서버는 인코딩을 디코딩하여 파일에 저장합니다. 테스트 결과는 실패합니다. 파일이 너무 크면 인코딩 길이가 길어집니다. ajax를 통해 비동기적으로 제출되는 최대 매개변수 수는 8000바이트입니다. 두 번째 시도는 얻은 base64 인코딩을 기반으로 분할하는 것입니다.얻은 base64 인코딩 문자열을 여러 부분으로 나누고 번호를 매긴 후 루프에서 ajax를 호출하여 전송합니다.
데이터를 받은 후 서버는 이름 작은 파일을 모두 받은 후 백그라운드 메서드를 호출하여 작은 파일을 병합합니다. 업로드된 파일이 1G를 초과했을 때 테스트 결과가 실패했습니다. 브라우저가 충돌했습니다. 파일을 읽을 때 파일이 너무 크고 일회성 읽기에서 반환된 base64 인코딩이 너무 커서 페이지가 충돌했습니다#🎜🎜. # 이를 바탕으로 한 번에 너무 큰 파일을 읽어서 발생하는 페이지 충돌을 피하기 위해 파일을 읽는 과정에서 일괄적으로 읽어서 인코딩을 얻고 싶습니다. .slice() 파일을 덩어리로 나누어 일괄 읽기를 구현합니다. 그리고 일괄 업로드를 서버에 비동기적으로 전송합니다
서버가 디코딩 및 파일 저장을 위한 데이터를 수신합니다
테스트가 성공적으로 완료되었으며 테스트는 거의 4G의 파일을 업로드했습니다 #🎜 🎜#
( 파일이 분할되어 있기 때문에 대용량 파일을 업로드할 때 대량의 ajax 요청이 시작되어 동시성이 많아지고 이로 인해 페이지가 다시 충돌할 수 있으므로 시차를 두고 요청을 사용합니다. )특정 구현 코드다음 코드 게시프론트 엔드 프레임워크:layui백엔드 프레임워크: tp5 페이지 코드:
<div class="layui-form-item"> <label class="layui-form-label">视频上传</label> <div class="layui-input-block layui-upload-video-btn"> <ul> <li class="img-upload"> <label></label> <input type="file" class="video-upload-file layui-upload-video-file-btn" name="file"/> <video width="320" height="240" controls style="display: none"> <source src="" type="video/mp4"> <source src="" type="video/ogg"> 您的浏览器不支持Video标签。 </video> <span style="display: none">X</span> <input type="hidden" class="video-link-id" name="video_link_id" value=""> </li> <li>//视频上传会比较久(上传完会有提示)</li> </ul> </div> </div>
$('.video-upload-file').on('change',function(){ layer.msg('正在提交视频......'); //隐藏按钮,显示进度条 $('.layui-upload-video').hide(); $('.layui-progress-ads').show(); var loads_video = layer.load(2,{shade: [0.2, '#3a3535']}); //产生加载圈,禁止用户其他操作 var thisFile = $(this); var reader=new FileReader(); var file_size = this.files[0].size; //文件大小 var limit = 8388608; //每次读取文件的大小 // var limit = 1048000; //每次读取文件的大小 var up_count = Math.ceil(file_size/limit); //总上传次数 var type = this.files[0].type.substr(this.files[0].type.indexOf('/')+1); //文件类型 var success_num = 0; //用于存放上传成功的数据的id var check = 1; //防止多次合并 console.log('文件大小:'+this.files[0].size); console.log('文件类型:'+type); console.log('分割上传次数:'+up_count); //分段读取文件 readFile(this.files[0], 0, limit); function readFile(file, num, limit){ // console.log('第'+num+'次:'+num*limit); reader.readAsDataURL(file.slice(num*limit, (num+1)*limit)); reader.onload = function(e){ console.log(reader.result.length); console.log(reader.result); //异步base64的数据传输到服务器 ajax_way(reader.result, name, num+1, thisFile); if((num+1)*limit <= file_size){ readFile(file, num+1, limit); } } } function ajax_way(data,name,num, thisFile){ //避免一次性生成太多的请求 if(num+1 > 60){ // console.log('等待两秒'); sleep(6000); // console.log('等待结束'); } $.ajax({ url: "<?= url('admin/video/up_mfile');?>", type: "POST", data: {video:data,name:name,num:num}, // async:false, //是否采用同步,串行发送请求 success: function (data) { if(data.code == 1){ //上传成功,成功次数加一 success_num++; console.log(num+'完成'); console.log('已完成:'+success_num+'/'+up_count); //计算完成的百分比 var precentage = Math.ceil((success_num/up_count)*100); //更改进度条显示 $('.layui-progress-ads-btn').attr('lay-percent', precentage+'%'); $('.layui-progress-ads-btn').css('width', precentage+'%'); $('.layui-progress-text').html(precentage+'%'); //如果分割文件都上传了则调用接口合并文件 if(success_num == up_count && check == 1){ check = 0; success_num = 0; merge_mfile(name, up_count, thisFile, type); } } }, error:function(e){ console.log('出错了:'+num); //传输出错则重新上传 ajax_way(data, name, num, thisFile); } }); } //合并文件 function merge_mfile(name, count, thisFile, type){ $.ajax({ url:"<?= url('admin/video/merge_mfile');?>", data:{name:name, count:count, type:type}, type:"POST", success:function(data){ if (data.code==1){ layer.close(loads_video); layer.msg('视频提交成功'); thisFile.siblings('.video-link-id').val(data.data); }else{ layer.msg('视频提交异常请重新提交'); //显示按钮,隐藏进度条 $('.layui-upload-video').show(); $('.layui-progress-ads').hide(); //将进度条置零 $('.layui-progress-ads-btn').attr('lay-percent', '0%'); $('.layui-progress-ads-btn').css('width', '0%'); $('.layui-progress-text').html('0%'); //清空已选中的文件 var file = $(".layui-upload-video-file-btn"); file.after(file.clone().val("")); file.remove(); } } }) } function sleep(n) { //n表示的毫秒数 var start = new Date().getTime(); while (true) if (new Date().getTime() - start > n) break; } return false; });
layui 사용법 튜토리얼
열위 내용은 tp5+layui를 사용한 대용량 파일 업로드 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Layui 로그인 페이지 점프 설정 단계: 점프 코드 추가: 로그인 양식 제출 버튼 클릭 이벤트에 판단을 추가하고, 로그인 성공 후 window.location.href를 통해 지정된 페이지로 점프합니다. 양식 구성 수정: 숨겨진 입력 필드를lay-filter="login"의 양식 요소에 추가합니다. 이름은 "redirect"이고 값은 대상 페이지 주소입니다.

layui는 양식의 모든 필드 데이터를 직접 가져오는 방법, 단일 양식 요소의 값을 가져오는 방법, formAPI.getVal() 메서드를 사용하여 지정된 필드 값을 가져오는 방법, 양식 데이터를 직렬화하는 방법 등 양식 데이터를 가져오는 다양한 방법을 제공합니다. 이를 AJAX 요청 매개변수로 사용하면 양식 제출 이벤트를 수신하여 데이터를 가져옵니다.

Layui 프레임워크의 반응형 레이아웃 기능을 사용하면 적응형 레이아웃을 구현할 수 있습니다. 단계에는layui 프레임워크 참조가 포함됩니다. 적응형 레이아웃 컨테이너를 정의하고layui-container 클래스를 설정합니다. 반응형 중단점(xs/sm/md/lg)을 사용하여 특정 중단점 아래의 요소를 숨깁니다. 그리드 시스템(layui-col-)을 사용하여 요소 너비를 지정합니다. 오프셋(layui-offset-)을 통해 간격을 만듭니다. 반응형 유틸리티(layui-invisible/show/block/inline)를 사용하여 요소의 가시성과 표시 방식을 제어합니다.

Layui를 사용하여 데이터를 전송하는 방법은 다음과 같습니다. Ajax 사용: 요청 객체를 생성하고 요청 매개변수(URL, 메서드, 데이터)를 설정한 후 응답을 처리합니다. 기본 제공 방법 사용: $.post, $.get, $.postJSON 또는 $.getJSON과 같은 기본 제공 방법을 사용하여 데이터 전송을 단순화합니다.

Layui와 Vue의 차이점은 주로 기능과 관심사에 반영됩니다. Layui는 UI 요소의 신속한 개발에 중점을 두고 페이지 구성을 단순화하기 위해 사전 제작된 구성 요소를 제공하는 반면, Vue는 데이터 바인딩, 구성 요소 개발 및 상태 관리에 중점을 두고 복잡한 애플리케이션 구축에 더 적합한 풀 스택 프레임워크입니다. Layui는 배우기 쉽고 빠르게 페이지를 구축하는 데 적합합니다. Vue는 학습 곡선이 가파르지만 확장 가능하고 유지 관리가 쉬운 애플리케이션을 구축하는 데 도움이 됩니다. 프로젝트 요구사항과 개발자 기술 수준에 따라 적절한 프레임워크를 선택할 수 있습니다.

layui를 실행하려면 다음 단계를 수행합니다. 1.layui 스크립트를 가져옵니다. 3.layui 구성 요소를 사용합니다.(선택 사항) 5.스크립트 호환성을 확인하고 기타 고려 사항에 주의합니다. 이러한 단계를 통해layui의 기능을 사용하여 웹 애플리케이션을 구축할 수 있습니다.

layui는 개발자가 현대적이고 반응성이 뛰어난 대화형 웹 애플리케이션을 신속하게 구축하는 데 도움이 되는 풍부한 UI 구성 요소, 도구 및 기능을 제공하는 프런트 엔드 UI 프레임워크입니다. 해당 기능에는 유연하고 가벼운 모듈식 디자인, 풍부한 구성 요소, 강력한 도구 및 간편한 기능이 포함됩니다. 맞춤화. 이는 관리 시스템, 전자상거래 플랫폼, 콘텐츠 관리 시스템, 소셜 네트워크 및 모바일 애플리케이션을 포함한 다양한 웹 애플리케이션 개발에 널리 사용됩니다.

layui와 vue는 프런트 엔드 프레임워크입니다.layui는 UI 구성 요소와 도구를 제공하는 경량 라이브러리입니다. vue는 UI 구성 요소, 상태 관리, 데이터 바인딩, 라우팅 및 기타 기능을 제공하는 포괄적인 프레임워크입니다. layui는 모듈형 아키텍처를 기반으로 하고, vue는 컴포넌트화된 아키텍처를 기반으로 합니다. Laui는 더 작은 생태계를 가지고 있지만, vue는 크고 활동적인 생태계를 가지고 있습니다. Laui의 학습 곡선은 낮고, Vue의 학습 곡선은 가파르다. Layui는 소규모 프로젝트와 UI 구성 요소의 빠른 개발에 적합한 반면, vue는 풍부한 기능이 필요한 대규모 프로젝트 및 시나리오에 적합합니다.
