>  기사  >  백엔드 개발  >  PHP 파일 업로드 감지 및 처리

PHP 파일 업로드 감지 및 처리

墨辰丷
墨辰丷원래의
2018-06-05 16:04:454178검색

이 글은 주로 PHP 파일 업로드 감지 및 처리에 대해 소개합니다. 관심 있는 친구들이 참고하면 도움이 될 것입니다.

업로드 입력방식이 그렇게 나쁜건가요? 물론 그렇지 않습니다. 파일을 업로드하는 경우에도 매우 간단하고 안정적입니다. PHP에서는 복합 형식만 필요합니다.

코드는 다음과 같습니다.

<form enctype="multipart/form-data" action="__URL__" method="POST">

입력 상자:

코드는 다음과 같습니다.

<input name="userfile" type="file" />

및 서버 측 라인 코드:

코드는 다음과 같습니다:

move_uploaded_file($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;], &#39;/var/www/uploads/&#39;. basename($_FILES[&#39;userfile&#39;][&#39;name&#39;]));

전체 업로드 프로세스를 수행합니다.
하지만 파일이 커질수록 양식 업로드의 단점이 드러납니다. 특히, 지나치게 큰 파일 업로드를 방지하기 위해 최소 파일 크기를 확보한다는 단순한 아이디어가 너무 어려워졌습니다. 하나씩 살펴보겠습니다.
By MAX_FILE_SIZEMAX_FILE_SIZE 숨겨진 필드(바이트 단위)는 파일 입력 필드 앞에 배치되어야 하며 해당 값은 수신된 파일의 최대 크기입니다. 이는 브라우저에 대한 권장 사항이며, PHP도 이를 확인합니다. 이 설정은 브라우저 측에서 쉽게 무시할 수 있으므로 이 기능을 사용하여 대용량 파일을 차단할 것으로 기대하지 마십시오. 실제로 PHP 설정의 최대 업로드 파일 크기는 만료되지 않습니다. 하지만 이 항목을 양식에 추가하는 것이 더 좋습니다. 사용자가 대용량 파일이 업로드될 때까지 기다리다가 파일이 너무 커서 업로드가 실패했음을 발견하는 데 시간을 소비하는 문제를 피할 수 있기 때문입니다.
분명히 PHP 개발자도 대용량 파일 업로드 문제를 고려했지만 매뉴얼에 나와 있듯이 MAX_FILE_SIZE는 브라우저에 대한 제안일 뿐이며 실제로 모든 주류 브라우저는 지금까지 이 제안을 채택하지 않았으므로 MAX_FILE_SIZE를 사용합니다. 장식과 같아서 실현 가능하지 않습니다.
서버측을 통해MAX_FILE_SIZE가 유효하지 않기 때문에 사용자가 서버에 파일을 업로드할 수 있습니다. 서버측에서는 $_FILES['userfile']['size']를 통해 사용자가 업로드한 파일의 크기를 판단합니다. 를 클릭한 후 업로드 및 반환 정보를 수락할지 여부를 결정합니다. 서버에 대한 부하와 악의적인 방해 행위 가능성을 배제하면 이 솔루션은 대역폭 낭비에 지나지 않으며 사용자의 파일 업로드도 제한하는 것으로 보입니다.
그러나 이것은 가능하지 않습니다. PHP 파일 업로드는 php.ini의 다음 설정에 의해 영향을 받습니다:

  • post_max_size

  • upload_max_filesize

  • max_execution_time

  • memory_limit

매뉴얼에 설정 방법이 자세히 설명되어 있는데도 이 방법이 여전히 불가능하다고 하는 이유는 php 실행 스크립트가 memory_limit를 초과하면 POST 데이터가 모두 손실되었으며 오류가 보고되지 않았습니다!
사용자가 매우 긴 양식을 작성하고 이를 메모리 제한을 초과하는 파일과 함께 업로드한다고 상상해 보십시오. 오랜 대기 시간 후에 그들은 기다리고 있는 것이 또 다른 깔끔한 빈 양식이라는 것을 알게 됩니다. 게다가 수십 MB의 서버 트래픽은 파일 크기 감지에만 사용되는데, 이는 현재 네트워크 환경에서 허용되지 않습니다.
Javascript를 통해Javascript는 브라우저를 기반으로 하기 때문에 불가능해 보이는 많은 작업을 수행할 수 있지만 JS는 브라우저가 할 수 없는 작업을 수행할 수 없습니다. 본질적인 단점으로 인해 이 작업은 Javascript만으로는 불가능합니다. 그러나 일부 IE 전용 방법은 여전히 ​​존재하며 참조용으로만 사용됩니다.
Flash를 통해Flash의 FileReference 클래스는 비교적 포괄적인 파일 처리 방법 세트를 제공합니다. 이제 대부분의 대용량 파일 업로드에도 Flash 기반 솔루션이 사용됩니다. Flash를 사용하여 Js와 상호작용하는 경우 클라이언트가 파일 크기를 감지할 수 있습니까? 대답은 '예'입니다.
먼저 플래시 파일에서 FileReference 클래스를 인스턴스화합니다.

var fr = new FileReference();

이 클래스를 기반으로 Flash에서 제공하는 파일 탐색 및 SelectFile 이벤트를 사용하여 브라우저 이벤트를 대체할 수 있습니다.
1. SelectFile 바인딩

fr.addEventListener(Event.SELECT, onSelectFile);

2. flash

var s = {
 size:0,
 name:&#39;&#39;,
 type:&#39;&#39;
}

3에서 얻은 파일 정보를 저장하기 위한 객체를 만듭니다. SelectFile 이벤트가 발생하면 파일 정보를 전달합니다

function browseFile():void {<br>
 fr.browse();<br>
}

5. Js가 호출할 수 있도록 browserFile 메소드를 공개합니다.

function onSelectFile(e:Event):void {<br>
 s.size = fr.size;<br>
 s.name = fr.name;<br>
 s.type = fr.type;<br>
}
6. 얻은 파일 정보를 Js

에 전달합니다.

ExternalInterface.call("onSelectFile",s);

现在我们已经可以通过Js获得由flash传递来的文件大小信息了,具体的实现可以参看Demo 。
结论
问题至此似乎已经得到解决了,我们已经成功的校验了文件大小不是么。但本文的最终结论是,基于Flash的文件大小校验,仍然不可行。
文件大小校验的唯一目的,是为了上传。在上面的Demo中可以看到校验成功的文件名会显示在一个输入框里。熟悉上传的同学不觉得少了什么吗?没错,通过 flash只能得到文件名,而无法得到文件的完整路径,而文件路径却是input方式上传的必要条件。所以虽然可以成功的通过Flash与Js交互校验文 件大小,但我们能做到的也仅仅只是校验而已,之后想要上传,唯有继续通过flash方式进行。
Flash开发出于安全考虑屏蔽了文件的完整路径这无可厚非,不过文件上传,尤其是PHP环境下的文件校验上传方案仍然没有得到最好的解决。
当然弥补的方法有很多:

基于Perl的项目 FileChucker , XUpload , Uber-Uploader基于Flash的项目 SWFUpload还有筒子用PHP直接 在服务器华丽的建立socket链接

但终究我希望有一天能看到仅基于HTML就能实现的严整健壮的上传方案,但愿这一天不会太远。
最后是本次的代码下载 。
php文件上传大小设置详解用php上传文件,问题最多的就是上传大体积文件时出现错误。 这就涉及到php的配置文件——php.ini
在此配置文件中,有这么几个值是跟文件上传有密切关系的:

  • file_uploads = on //是否允许系统支持文件上传

  • upload_tmp_dir //临时文件的存储路径,linux下为系统默认路径,win32下需要指定

  • upload_max_filesize = 2m //允许文件上传最大体积

  • post_max_size = 2m //通过post方法给php时,php所能接受的最大数据容量

如果你上传的文件体积在8m一下(通常情况),那修改以上设置就可以满足你的要求了。
但要>8m,那除了上面几个值,还要特别关注另外两个值了:

  • max_execution_time = 30 //每个script所执行的最大时间(php上传就时,体积大了,就是个时间问题)

  • memory_limit = 8m //每个script所能消耗的最大memory

试着把这两个值改大些。一般就可以解决大多数问题了。

就此推断,上传文件的体积是可以无穷大的。但还要考虑你的网络情况,等等。
在php.net上,有人说按照这个方法改了后,大于100m的文件还是会出错,不知道是不是PHP本身的问题了。

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP中基于sleep函数实现定时执行功能的方法

PHP 输出缓冲控制详解

php 输入输出流详解及实例分析

위 내용은 PHP 파일 업로드 감지 및 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.