PHP는 배열과 단계에 따라 파일 업로드를 완료합니다.
양식으로 제출한 파일 내용은 file.php를 가리킵니다.
file.php의 PHP 코드를 통해 업로드된 파일을 처리합니다.
업로드할 사진 이름을 선택합니다. 사진 이름이 psu.jpg라고 가정하고 업로드하려면 클릭하세요.
PHP는 파일 데이터를 위한 특별한 시스템 함수 $_FILES를 준비했습니다. 업로드된 파일의 모든 관련 데이터는 이 시스템 함수에 저장됩니다.
PHP 파일에서 $_FILES를 인쇄하여 이 배열의 구조를 관찰합니다.
<?php //var_dump()或print_r() //打印变量的相关信息,将变量的信息详细的展示出来 var_dump($_FILES); ?>
인쇄된 결과의 배열 구조는 다음과 같습니다.
array (size=1) 'file' => array (size=5) //文件名 'name' => string 'psu.jpg' (length=7) //文件的mime类型 'type' => string 'image/jpeg' (length=10) //缓存文件,上传的图片即保存在这里 'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23) //错误码,详见上面错误码介绍 'error' => int 0 //上传的文件大小 'size' => int 225824
가져오기 배열 구조 위.
파일 처리 프로세스를 시작할 수 있습니다.
첫 번째 단계는 오류 코드를 확인하는 것입니다.
<?php if($_FILES['file']['error'] > 0){ switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错<br/>"; } }else{ //错误码为0,即上传成功,可以进行后续处理,处理流程见下文 } ?>
위 코드에서는 오류 코드와 해당 오류를 자세히 소개할 수 있습니다. 정확한 오류 프롬프트를 생성하는 오류 코드입니다.
두 번째 단계는 파일이 크기를 초과하는지 확인하는 것입니다. 실제 프로젝트에서는 시스템 하드웨어 제한, 저장장치 제한으로 인해 사용자가 무제한으로 파일을 업로드하는 것이 불가능하므로 사용자가 업로드하는 파일 크기를 제한해야 합니다. 적절한 제한 크기를 정의하면 애플리케이션이 보다 안정적으로 실행될 수 있습니다.
<?php //判断错误 if ($_FILES['file']['error'] > 0) { //有错误可停止执行 } else { //当前上传文件无误,运行本段代码 //判断文件是否超出了指定的大小 //单位为byte $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { //判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示 exit("文件超出指定大小"); } } ?>
우리가 지정하는 파일 크기를 $MAX_FILE_SIZE로 정의합니다. 이 변수의 계산 단위는 업로드된 파일의 $_FILES['file']['size'] 크기에 해당하는 바이트입니다.
샘플 코드에서는 크기가 약 100K 이하인 파일만 허용됩니다.
세 번째 단계는 파일의 MIME 형식이 올바른지 확인하는 것입니다.
우리의 파일 업로드 기능은 사용자가 업로드한 파일이 요구 사항을 충족하는지 확인해야 하는 경우가 많으며, 사용할 수 없는 파일을 업로드한 후에는 온라인 애플리케이션의 전반적인 표시 효과가 영향을 받습니다. 악영향을 미치게 됩니다. 따라서 사용자가 업로드한 파일이 요구 사항을 충족하는지 확인하려면 MIME 유형과 접미사 이름을 사용해야 합니다.
아래 예제 코드에서는 현재 프로젝트 요구 사항이 업로드된 이미지를 지정하는 것으로 가정하고 사용자가 요구 사항을 충족하지 않는 파일을 업로드하면 접미사가 GIF 또는 jpg인 파일을 업로드해야 합니다. 오류 메시지가 반환됩니다.
<?php /*判断后缀名和MIME类型是否符合指定需求 例如: 当前项目指定上传后缀为.jpg或.gif的图片,则$allowSuffix = array('jpg','gif'); */ //定义允许的后缀名数组 $myImg = explode('.', $_FILES['file']['name']); /* explode() 将一个字符串用指定的字符切割,并返回一个数组,这里我们将文件名用'.''切割,结果存在$myImg中,文件的后缀名即为数组的最后一个值 */ $myImgSuffix = array_pop($myImg); /* 根据上传文件名获取文件的后缀名 使用in_array()函数,判断上传文件是否符合要求 当文件后缀名不在我们允许的范围内时退出上传并返回错误信息 */ if(!in_array($myImgSuffix, $allowSuffix)){ exit("文件后缀名不符"); } /* mime类型和文件后缀名的对应关系,我们可以通过很多途径查询到,为了避免用户自主修改文件后缀名造成文件无法使用。 mime类型也必须做出限制检查mime类型,是为了防止上传者直接修改文件后缀名 导致文件不可用或上传的文件不符合要求。 */ //数组内容为允许上传的mime类型 $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif" ); if(!in_array($_FILES['file']['type'], $allowMime)){ //判断上传文件的mime类型是否在允许的范围内 exit('文件格式不正确,请检查'); //如果不在允许范围内,退出上传并返回错误信息 } ?>
네 번째 단계는 지정된 경로와 파일 이름을 생성하는 것입니다.
프로젝트의 파일 배열에 따라 파일 저장 경로를 생성합니다. 파일 이름이 중복되어 발생하는 오류를 방지하기 위해 특정 형식에 따라 파일 이름이 무작위로 생성됩니다.
<?php //指定上传文件夹 $path = "upload/images/"; /* 根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名 */ $name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix; ?>
다섯 번째 단계는 파일 업로드 여부를 확인하는 것입니다.
is_uploaded_file() 함수는 대상 파일이 업로드된 파일인지 확인하는 전용 함수입니다.
<?php //使用is_uploaded_file()判断是否是上传文件,函数介绍见上文 if(is_uploaded_file($_FILEs['file']['tmp_name'])){ } ?>
6단계, 파일을 지정된 위치로 이동합니다.
move_uploaded_file() 함수를 사용하여 파일을 지정된 위치로 이동하고 이름을 지정합니다. Linux 시스템에는 대상 디렉터리에 대한 권한이 있고 디스크 공간이 충분한지 여부가 충분하지 않으면 업로드 작업이 실패합니다.
<?php /* 使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。 */ if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){ //提示文件上传成功 echo "上传成功"; }else{ /* 文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限 */ echo '上传失败'; } }else{ echo '不是上传文件'; } } ?>
이 파일 조각을 전체 파일로 정리합니다:
<?php if ($_FILES['file']['error'] > 0) { switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误 case '1': echo '文件过大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上传'; break; case '4': echo '文件没有被上传'; break; case '6': echo '找不到指定文件夹'; break; case '7': echo '文件写入失败'; break; default: echo "上传出错<br/>"; } } else { $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { exit("文件超出指定大小"); } $allowSuffix = array( 'jpg', 'gif', ); $myImg = explode('.', $_FILES['file']['name']); $myImgSuffix = array_pop($myImg); if (!in_array($myImgSuffix, $allowSuffix)) { exit("文件后缀名不符"); } $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif", ); if (!in_array($_FILES['file']['type'], $allowMime)) { exit('文件格式不正确,请检查'); } $path = "upload/images/"; $name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix; if (is_uploaded_file($_FILEs['file']['tmp_name'])) { if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) { echo "上传成功"; } else { echo '上传失败'; } } else { echo '不是上传文件'; } } ?>