찾다
웹 프론트엔드레이이 튜토리얼tp5+layui를 사용한 대용량 파일 업로드 소개

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>

js 코드:

$(&#39;.video-upload-file&#39;).on(&#39;change&#39;,function(){
        layer.msg(&#39;正在提交视频......&#39;);
        //隐藏按钮,显示进度条
        $(&#39;.layui-upload-video&#39;).hide();
        $(&#39;.layui-progress-ads&#39;).show();
        var loads_video = layer.load(2,{shade: [0.2, &#39;#3a3535&#39;]});      //产生加载圈,禁止用户其他操作
        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(&#39;/&#39;)+1);   //文件类型
        var success_num = 0;        //用于存放上传成功的数据的id
        var check = 1;             //防止多次合并
        console.log(&#39;文件大小:&#39;+this.files[0].size);
        console.log(&#39;文件类型:&#39;+type);
        console.log(&#39;分割上传次数:&#39;+up_count);
        //分段读取文件
        readFile(this.files[0], 0, limit);
        function readFile(file, num, limit){
            // console.log(&#39;第&#39;+num+&#39;次:&#39;+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(&#39;等待两秒&#39;);
                sleep(6000);
                // console.log(&#39;等待结束&#39;);
            }
            $.ajax({
                url: "<?= url(&#39;admin/video/up_mfile&#39;);?>",
                type: "POST",
                data: {video:data,name:name,num:num},
                // async:false,      //是否采用同步,串行发送请求
                success: function (data) {
                    if(data.code == 1){
                        //上传成功,成功次数加一
                        success_num++;
                        console.log(num+&#39;完成&#39;);
                        console.log(&#39;已完成:&#39;+success_num+&#39;/&#39;+up_count);
                        //计算完成的百分比
                        var precentage = Math.ceil((success_num/up_count)*100);
                        //更改进度条显示
                        $(&#39;.layui-progress-ads-btn&#39;).attr(&#39;lay-percent&#39;, precentage+&#39;%&#39;);
                        $(&#39;.layui-progress-ads-btn&#39;).css(&#39;width&#39;, precentage+&#39;%&#39;);
                        $(&#39;.layui-progress-text&#39;).html(precentage+&#39;%&#39;);
                        //如果分割文件都上传了则调用接口合并文件
                        if(success_num == up_count && check == 1){
                            check = 0;
                            success_num = 0;
                            merge_mfile(name, up_count, thisFile, type);
                        }
                    }
                },
                error:function(e){
                    console.log(&#39;出错了:&#39;+num);
                    //传输出错则重新上传
                    ajax_way(data, name, num, thisFile);
                }
            });
        }

        //合并文件
        function merge_mfile(name, count, thisFile, type){
            $.ajax({
                url:"<?= url(&#39;admin/video/merge_mfile&#39;);?>",
                data:{name:name, count:count, type:type},
                type:"POST",
                success:function(data){
                    if (data.code==1){
                        layer.close(loads_video);
                        layer.msg(&#39;视频提交成功&#39;);
                        thisFile.siblings(&#39;.video-link-id&#39;).val(data.data);
                    }else{
                        layer.msg(&#39;视频提交异常请重新提交&#39;);
                        //显示按钮,隐藏进度条
                        $(&#39;.layui-upload-video&#39;).show();
                        $(&#39;.layui-progress-ads&#39;).hide();
                        //将进度条置零
                        $(&#39;.layui-progress-ads-btn&#39;).attr(&#39;lay-percent&#39;, &#39;0%&#39;);
                        $(&#39;.layui-progress-ads-btn&#39;).css(&#39;width&#39;, &#39;0%&#39;);
                        $(&#39;.layui-progress-text&#39;).html(&#39;0%&#39;);
                        //清空已选中的文件
                        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에 대한 더 많은 지식을 알고 싶다면 주목해주세요.

layui 사용법 튜토리얼

위 내용은 tp5+layui를 사용한 대용량 파일 업로드 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 博客园에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
무한 스크롤링에 Layui의 흐름 모듈을 어떻게 사용합니까?무한 스크롤링에 Layui의 흐름 모듈을 어떻게 사용합니까?Mar 18, 2025 pm 01:01 PM

이 기사는 무한 스크롤, 커버 설정, 모범 사례, 성능 최적화 및 향상된 사용자 경험을위한 사용자 정의에 Layui의 Flow Module을 사용하는 것에 대해 설명합니다.

Layui의 요소 모듈을 사용하여 탭, 아코디언 및 진행 막대를 만드는 방법은 무엇입니까?Layui의 요소 모듈을 사용하여 탭, 아코디언 및 진행 막대를 만드는 방법은 무엇입니까?Mar 18, 2025 pm 01:00 PM

이 기사는 Layui의 요소 모듈을 사용하여 탭, 아코디언 및 진행 막대와 같은 UI 요소를 작성하고 사용자 정의하는 방법에 대해 자세히 설명합니다.

Layui의 회전식 모듈의 모양과 동작을 어떻게 사용자 정의합니까?Layui의 회전식 모듈의 모양과 동작을 어떻게 사용자 정의합니까?Mar 18, 2025 pm 12:59 PM

이 기사에서는 전환 효과, 자동 재생 설정 및 사용자 정의 탐색 컨트롤 추가를 포함하여 외관 및 동작을위한 CSS 및 JavaScript 수정에 중점을 둔 Layui의 회전 목마 모듈 사용자 정의에 대해 설명합니다.

Layui의 회전 목마 모듈을 사용하여 이미지 슬라이더를 만드는 방법은 무엇입니까?Layui의 회전 목마 모듈을 사용하여 이미지 슬라이더를 만드는 방법은 무엇입니까?Mar 18, 2025 pm 12:58 PM

이 기사는 이미지 슬라이더 용 Layui의 회전 목마 모듈 사용, 설정 단계, 사용자 정의 옵션, 자동 재생 및 내비게이션 구현 및 성능 최적화 전략을 사용하는 방법을 안내합니다.

파일 유형 및 크기를 제한하도록 Layui의 업로드 모듈을 어떻게 구성합니까?파일 유형 및 크기를 제한하도록 Layui의 업로드 모듈을 어떻게 구성합니까?Mar 18, 2025 pm 12:57 PM

이 기사에서는 Layui의 업로드 모듈 구성에 대해 논의하고, 승인, Exts 및 크기 속성을 사용하여 파일 유형 및 크기를 제한하고 위반에 대한 오류 메시지를 사용자 정의합니다.

Layui의 레이어 모듈을 사용하여 모달 창과 대화 상자를 만드는 방법은 무엇입니까?Layui의 레이어 모듈을 사용하여 모달 창과 대화 상자를 만드는 방법은 무엇입니까?Mar 18, 2025 pm 12:46 PM

이 기사는 Layui의 레이어 모듈을 사용하여 모달 창과 대화 상자를 만들고 설정, 유형, 사용자 정의 및 피하는 일반적인 함정을 자세히 설명하는 방법을 설명합니다.

Layui는 Bootstrap 및 Semantic UI와 같은 다른 CSS 프레임 워크와 어떻게 비교됩니까?Layui는 Bootstrap 및 Semantic UI와 같은 다른 CSS 프레임 워크와 어떻게 비교됩니까?Mar 14, 2025 pm 07:29 PM

단순성과 성능으로 알려진 Layui는 설계, 구성 요소 및 통합 편의성에 대한 부트 스트랩 및 시맨틱 UI와 비교됩니다. Layui는 모듈성 및 중국 지원에 뛰어납니다. (159 자)

일반적인 웹 응용 프로그램 이외의 Layui의 일부 고급 사용 사례는 무엇입니까?일반적인 웹 응용 프로그램 이외의 Layui의 일부 고급 사용 사례는 무엇입니까?Mar 14, 2025 pm 07:28 PM

Layui는 기본 웹 앱을 넘어 스파, 실시간 대시 보드, PWA 및 복잡한 데이터 시각화로 확장되어 모듈 식 설계 및 풍부한 UI 구성 요소를 사용하여 엔터프라이즈 수준의 사용자 경험을 향상시킵니다 (159 자)

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구