programing

PHP에 파일을 업로드 할 때 $_FILES가 비어 있는 이유는 무엇입니까?

javaba 2023. 1. 9. 21:32
반응형

PHP에 파일을 업로드 할 때 $_FILES가 비어 있는 이유는 무엇입니까?

Windows 7 WampServer 2 가 windows windows 。Apache 2.2.11 PHP 5.2.11입니다.하려고 하면 되는 PHP에서는 됩니다.$_FILES어레이가 비어 있습니다. 문서에는 .c:\wamp\tmp★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★。php.ini파일 업로드 등을 허용합니다.tmp폴더에 현재 사용자에 대한 읽기/쓰기 권한이 있습니다.황스스당

HTML:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
        Choose a file to upload: <input name="uploadedfile" type="file" /><br />
        <input type="submit" value="Upload File" />
    </form>
</body>
</html>

PHP:

<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>

다음은 PHP에서 파일을 업로드하기 위한 체크리스트입니다.

  1. php.ini로 하다
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M
  • 하면 '어울리지 않다'를 할 요..htaccess ★★★★★★★★★★★★★★★★★」.user.ini이고 "할 수 없는 php.ini.
  • 파일을합니다. - ini 파일을 합니다.phpinfo()설정이 실제로 적용되고 있는지 확인하는 기능을 제공합니다.
  • 사이즈의 해 .- 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 합니다.100M 않다 100MB.
  1. 하세요.<form>에는 ''가 .enctype="multipart/form-data"기여하다.다른 태그는 사용할 수 없습니다. FORM 태그여야 합니다.철자가 올바른지 다시 한 번 확인합니다.멀티파트/폼 데이터가 Word OR에서 웹 사이트 블로그로 붙여넣은 스마트 따옴표가 아닌 스트레이트 따옴표로 둘러싸여 있는지 다시 확인합니다(WordPress는 스트레이트 따옴표로 변환합니다!).페이지에 여러 개의 양식이 있는 경우, 두 양식 모두 이 속성을 가지고 있는지 확인하십시오.수동으로 입력하거나 수동으로 입력한 작은 따옴표를 그대로 사용합니다.

  2. " " " " " " " " " " " " " " " " " " " " " " 。name 하다. 여러 지원해야 할 를 붙입니다.여러 개를 지원해야 할 경우 이름 끝에 대괄호를 넣습니다.

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  3. 및 읽기 + 되어 있는지 합니다.tmp 는 + 쓰기 권한을 설정합니다.에서 PHP로 지정되어 .upload_tmp_dir.

  4. 파일의 수신처와 tmp/upload 디렉토리에 공백이 없는지 확인합니다.

  5. 것을 합니다.<form>에는 「」가 있습니다</form>그를닫닫 닫닫닫다다

  6. 에 FORM이 있는지 합니다.method="POST"업로드를 . GET 요청은 멀티파트/폼 데이터 업로드를 지원하지 않습니다.

  7. 파일 입력 태그에 NAME 속성이 있는지 확인합니다.ID 속성이 충분하지 않습니다!ID 어트리뷰트는 POST payload가 아닌 DOM에서 사용하는 것입니다.

  8. 하여 Javascript를 하십시오.<input type="file">

  9. <form><form></form></form>

  10. 에서 HTML の 음음음음 like / like html html html html html html html html html html html html html html html html html html html 등의 비활성/합니다.<div><form></div></form>

  11. 또, 업 로드하는 파일에 영숫자가 아닌 문자가 포함되어 있지 않은 것을 확인해 주세요.

  12. PHP 설정 중 판명되었습니다..htaccess이 되고 있는 은, 그 중 하지 않은 것)와 「1」입니다.$_FILES어어있있있있

  13. 피하는 것도 것 요._에 기재되어 있습니다.name=""「」의 <input> 부착

  14. 파일 크기의 문제인지 여부를 좁히기 위해 매우 작은 파일을 업로드해 보십시오.

  15. 사용 가능한 디스크 공간을 확인합니다.매우 드물지만, 이 PHP Manual 페이지 코멘트에는 다음과 같이 기재되어 있습니다.

    $_FILES 배열이 갑자기 비어 있는 경우, 사용자의 양식이 올바른 것 같지만 임시 폴더 파티션에 사용할 수 있는 디스크 공간을 확인해야 합니다.설치에서 모든 파일 업로드가 경고 없이 실패했습니다.이를 많이 갈고 나서 추가 공간을 확보하려고 했는데, 그 후 갑자기 파일 업로드가 다시 작동했습니다.

  16. 페이지가 새로고침되는 일반 POST 요청이 아닌 AJAX POST 요청을 통해 양식을 제출하지 마십시오.위 목록의 모든 포인트를 살펴보니 $_FILES 변수가 비어있는 이유가 AJAX POST 요청을 사용하여 폼을 제출했기 때문이라는 것을 알게 되었습니다.ajax를 사용하여 파일을 업로드하는 방법도 있다는 것을 알지만 이것이 $_FILES 배열이 비어 있는 타당한 이유일 수 있습니다.

다음과 같이 합니다.
httpsweb.archive.org/web//httpgetluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/https://web.archive.org/web/20050426084124/httpgetluky.net/2004/10/04//

HTML 에 html 、 html에 html html에 html 。.enctype="multipart/form-data"이치

고객님의 범위 내에서php.ini, multiple, systems multiple, systems multiple, setup, systems multiple, setup, systems multiple,php.ini파일이 존재합니다.올바른 것을 편집하고 있는 것을 확인해 주세요.php.ini할 수 , "파일 업로드"도했습니까?upload_max_filesize ★★★★★★★★★★★★★★★★★」post_max_size업드드려려 ??? ??????따라서 다음과 같이 해야 합니다.

file_uploads = On; sounds like you already did this
post_max_size = 8M; change this higher if needed
upload_max_filesize = 8M; change this higher if needed

" " " : " :"c:\wamp\tmp"읽기 권한과 쓰기 권한을 모두 가지고 있습니까?를 후 하십니까?php.ini변하?????


덧붙이는 합니다.enctype="multipart/form-data" 예: " " ", "

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

다양한 포괄적인 답변을 주셔서 감사합니다.그것들은 모두 매우 도움이 된다.그 대답은 매우 이상한 것으로 판명되었다.PHP 5.2.11은 다음을 좋아하지 않는 것으로 나타났습니다.

post_max_size = 2G

또는

post_max_size = 2048M

2047M업로드가 동작합니다.

2시간으로 보이는 것과 같은 문제가 있습니다.먼저 서버 구성을 확인하는 것은 매우 간단합니다.

예:

echo $upload_max_size = ini_get('upload_max_filesize');  
echo $post_max_size=ini_get('post_max_size');   

는 " " " 입니다.:20mb 우리의 단은upload_max_size에 있다20mb, 배열은 만만 but but butnull은 저희 ★★★★★★★★★★★★★★★★★★★★★★.post_max_size 한다upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M

이름, 이름 <input type="file" name="uploadedfile" />

이것이 없으면 $_FILES는 비어 있습니다.

여기서 또 다른 원인을 찾았습니다.JQuery Mobile을 사용하고 형식 속성 data-ajax를 true로 설정하면 FILES 배열이 비어 있습니다.data-ajax를 false로 설정합니다.

아무도 이것을 언급하지 않았지만 그것은 나를 도와줬고 인터넷 상의 많은 곳에서 그것을 언급하지 않았다.

php.ini에서 다음 키가 설정되어 있는지 확인합니다.

    upload_tmp_dir="/path/to/some/tmp/folder"

웹 호스트에서 절대 서버 파일 경로를 사용하기를 원하는 경우 웹 호스트에 확인해야 합니다.이것을 판별하려면 , php.ini 파일의 다른 디렉토리 예를 참조할 수 있을 것입니다.설정하자마자 _FILES 오브젝트에 값이 입력되었습니다.

마지막으로 tmp 폴더와 파일을 이동하는 장소에 파일을 읽고 쓸 수 있도록 올바른 권한이 있는지 확인합니다.

저는 같은 문제로 고민하고 모든 것을 테스트했지만, 에러 보고는 받지 않았고, 아무 문제도 없는 것 같았습니다.error_reporting(E_ALL)이 있었는데, 갑자기 아파치 로그를 체크하지 않은 것을 깨닫고 voila!스크립트에 구문 오류가 발생했습니다...! ("}" 누락)

그래서, 이것은 분명히 확인해야 할 사항이지만, 잊어버릴 수 있다...내 경우(linux)는 다음과 같습니다.

/var/log/apache2/error.log

다음 이유로 php.ini에서 enable_post_data_reading=On을 확인합니다.

옵션을 비활성화하면 $_POST 및 $_FILES가 채워지지 않습니다.postdata를 읽는 유일한 방법은 php://input stream wrapper를 사용하는 것입니다.(... )

http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading의 경우

파일 배열을 업로드 할 경우,php.ini에서는, to which which which which which which which which로 되어 있습니다.20

주의:max_file_uploadsphp.ini 외부에서는 변경할 수 없습니다.PHP "버그" #50684 참조

또 다른 원인은 Apache Redirects입니다.제 경우, Apache의 httpd.conf는 당사 사이트의 특정 페이지를 http 버전으로, 다른 페이지를 https 버전으로 리다이렉트하도록 설정되어 있습니다(아직 리다이렉트 되어 있지 않은 경우).파일 입력이 있는 폼이 있는 페이지는 ssl을 강제로 실행하도록 설정된 페이지 중 하나였는데 폼의 액션으로 지정된 페이지는 http로 설정되어 있었습니다.따라서 페이지는 작업 페이지의 ssl 버전으로 업로드를 전송하지만 Apache가 페이지의 http 버전으로 리다이렉트하고 업로드된 파일을 포함한 포스트 데이터가 손실되었습니다.

가 「」인 .http://Some_long_URL/index.php명시적(명시적)의 을 지정할 해 주십시오.index.php만 아니라http://Some_long_URL에 기재되어 있습니다.action 의외로 경우 스크립트가 $_FILES!.는 빈 $_FILES입니다.

에서 제공하는 .sys_get_temp_dir공유 호스팅 환경에 있는 경우

여기 아직 언급되지 않은 확인 사항이 하나 더 있습니다.

스크립트가 PHP 파일 업로드 폴더라고 /tmp이 믿음은 사실로 인해 강화되었다.echo sys_get_temp_dir() . PHP_EOL;/tmpecho ini_get('upload_tmp_dir');이치노

내 파일에 합니다./tmp했습니다.sleep(30);(여기에 제시된 바와 같이) 내 스크립트에 대한 설명과 내 스크립트로 이동합니다./tmp폴더를 클릭하여 파일을 찾습니다.그러나 업로드된 파일은 어디에서도 찾을 수 없었다.

그 이유를 밝히기 위해 몇 시간 동안 노력했고, 여기에 제시된 모든 제안을 실행했습니다.

웹 검색 후, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」tmp되어 있는 을 발견했습니다.tmp다른 디렉토리에 있습니다.저는 PHP 스크립트가 실제로 업로드된 파일을 쓰고 있다는 것을 깨달았습니다.(이 폴더를 표시하려면 "Show Hidden Files" 설정이 cPanel에서 활성화 되어 있어야 합니다.)

왜 '우리'는 요?sys_get_temp_dir수가 부부 ?보 보? ?? ???

다음은 PHP.net 웹 페이지에서 설명한 내용입니다(최상위 댓글).

systemd가 PrivateTmp=true(센트의 기본값)인 Linux 시스템에서 실행되는 경우OS 7 및 기타 최신 버전)에서는 이 함수는 단순히 "/tmp"를 반환할 뿐이며, 실제로는 훨씬 길고 다소 역동적인 경로가 아닙니다.

이 SO 포스트에서는 이 문제에 대해서도 자세히 설명합니다.

같은 문제가 발생했는데 IDE가 문제의 일부라는 것을 알게 되었습니다.브라우저를 직접 사용하는 것이 아니라 IDE(PHPStorm)에서 직접 디버거를 실행하고 있었습니다.IDE 생성 URL은 다음과 같습니다.

"...localhost:63342/CB_Upload/index.php?_ijt=j2hcbacqepj87bvg66ncuohvne"

사용방법:

"...localhost/CB_Upload/index.php"

잘 작동했습니다.셋업은 PC / Windows 10 / WAMPSERVER 3.0.6 64비트

같은 문제가 발생했고, 어떤 주제도 제 실수가 아니었습니다."MultiViews"가 활성화된 경우 .htaccess 파일을 체크 인합니다.난 그들을 무력화시켜야 했다.

저도 비슷한 문제가 있었고 shamittomar가 언급한 것처럼 htaccess에서 잘못된 값이 발생하였습니다.

php_value post_max_size 10MB로로 합니다.php_value post_max_size 10M

는 공허했다$_FILES 그 뒤에<form enctype="multipart/form-data" method="post">

</div>
<div style="clear:both"></div>

초기 코드는 다음과 같았다.

<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>

수정하기로 하고

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
</div>
<div style="clear:both"></div>
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>

그래서 결론부터 말하자면<form enctype="multipart/form-data" method="post">야 한다.<input name, type, id그리고 그래서는 안 된다.<div> 기타 (「」)

내 상황에서는 올바른 코드가

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
</div>
<div style="clear:both"></div>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>

$_FILES가 비어있는 것도 문제가 있었습니다.위의 체크리스트에서는 .htaccess, httpd.conf 또는 httpd-vhost.conf의 MultiView는 언급하지 않습니다.

웹 사이트를 포함한 디렉토리의 옵션 디렉티브에 MultiViews가 설정되어 있는 경우, 업로드한 파일이 표시되는 경우 Content-Length 헤더에도 $_FILES는 비어 있습니다.

JQuery Mobile을 사용하는 경우

파일 입력에 멀티파트 형식을 사용하는 것은 Ajax에서 지원되지 않습니다.이 경우, 부모 폼을 data-backet="false"로 장식하여 폼이 서버에 올바르게 제출되도록 해야 합니다.

<form action="upload.php" method="post" enctype="multipart/form-data"  data-ajax="false">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

폼과 php 코드만 있는 단순한 php 페이지로 폼을 분리하여 테스트합니다.

부트스트랩 또는 Java 스크립트는 _FILES[]를 클리어 할 수 있습니다.그것은 나의 경우였다.

송신 를 는, 헤더의 「AJAX」를 해 주세요.Content-Type로 설정되어 있다.multipart/form-data; boundary=myAwesomeBoundary'서 ''는myAwesomeBoundary는 요청 본문을 구분하는 하나의 문자열입니다.해서 가가 the ...을 무효로 했다.Content-Typeheader only header's '로 설정함으로써 header를 합니다.multipart/form-databoundary수정은 헤더를 덮어쓰지 않고 브라우저가 생성하도록 하는 것이었습니다.

언급URL : https://stackoverflow.com/questions/3586919/why-would-files-be-empty-when-uploading-files-to-php

반응형