복붙노트

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

카테고리 없음

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

내 Windows 7 컴퓨터에 WampServer 2가 설치되어 있습니다. 아파치 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";
?>

해결법

  1. ==============================

    1.

    다음은 PHP에서 파일 업로드를위한 체크리스트입니다 :

    다음 몇 가지 사항에 대한 출처 : http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/

  2. ==============================

    2.

    HTML까지는 그 부분을 올바르게 설정 한 것처럼 보입니다. 양식에 올리려면 매우 중요한 enctype = "multipart / form-data"가 있어야합니다.

    php.ini 설치까지, 때로는 시스템에 여러 개의 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를 변경 한 후에 아파치를 다시 시작한 것을 기억하십니까?

  3. ==============================

    3.

    enctype = "multipart / form-data"를 양식에 추가하는 것이 중요합니다 (예 : example).

    <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>
    
  4. ==============================

    4.

    다양하고 포괄적 인 답변에 감사드립니다. 그것들은 모두 매우 도움이됩니다. 대답은 매우 이상한 것으로 밝혀졌습니다. PHP 5.2.11은 다음과 같은 것을 원하지 않습니다.

    post_max_size = 2G
    

    또는

    post_max_size = 2048M
    

    2047M으로 변경하면 업로드가 작동합니다.

  5. ==============================

    5.

    양식에 다음 속성 enctype = "multipart / form-data"가 있는지 확인하십시오.

  6. ==============================

    6.

    내가 발견 한 또 다른 원인 : JQuery Mobile을 사용하고 form 속성 data-ajax가 true로 설정되면 FILES 배열이 비어 있습니다. 그래서 data-ajax를 false로 설정하십시오.

  7. ==============================

    7.

    입력 요소에 'name'속성이 있는지 확인하십시오.

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

  8. ==============================

    8.

    나는 2 시간을 보는 것과 같은 문제를 안고있다. 서버 구성을 먼저 확인하기 란 매우 간단하다.

    예:

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

    모든 유형의 파일 크기는 20MB이지만 upload_max_size는 20MB를 초과하지만 array는 null입니다. 답변은 post_max_size가 upload_max_filesize보다 커야합니다.

    post_max_size = 750M  
    upload_max_filesize = 750M
    
  9. ==============================

    9.

    파일 배열을 업로드하려는 경우 php.ini에서 max_file_uploads를 증가시켜야 할 수도 있습니다. php.ini는 기본적으로 20으로 설정되어 있습니다.

    참고 : max_file_uploads는 php.ini 외부에서 변경할 수 없습니다. PHP "버그"# 50684를 참조하십시오.

  10. ==============================

    10.

    또 다른 가능한 원인은 아파치 리디렉션입니다. 제 경우에는 apache의 httpd.conf 파일이 우리 사이트의 특정 페이지를 http 버전으로 리디렉션하도록 설정하고, 다른 페이지는 https 버전으로 리디렉션하도록 설정했습니다 (이미없는 경우). 파일 입력이있는 양식이있는 페이지는 ssl을 강제 실행하도록 구성된 페이지 중 하나 였지만 양식의 작업으로 지정된 페이지는 http로 구성되었습니다. 따라서 페이지는 ssl 버전의 작업 페이지에 업로드를 제출하지만 아파치는이를 페이지의 http 버전으로 리디렉션했고 업로드 된 파일을 포함하여 게시물 데이터는 손실되었습니다.

  11. ==============================

    11.

    아무도 이것에 대해 언급했지만 그것은 나를 도왔고 그물에있는 많은 장소는 언급하지 않았습니다.

    php.ini가 다음 키를 설정하는지 확인하십시오 :

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

    절대 서버 파일 경로를 사용하려면 웹 호스트에 확인해야합니다. php.ini 파일에서 다른 디렉토리 예제를 볼 수 있어야합니다. 최대한 빨리 설정하면 _FILES 객체에 값이 있습니다.

    마지막으로 tmp 폴더와 파일을 이동하는 위치에 올바른 권한이 있어야 읽기 및 쓰기가 가능합니다.

  12. ==============================

    12.

    나는 같은 문제로 고심하고 모든 것을 시험했지만, 오류보고를 얻지는 않았고 아무 것도 잘못된 것처럼 보였다. error_reporting (E_ALL) 하지만 갑자기 내가 아파치 로그를 확인하지 못했다는 것을 깨달았다. 스크립트에 구문 오류가 있습니다 ...! (누락 된 "}")

    그래서 이것이 확인 된 것이 분명하지만, 잊혀 질 수 있습니다 ... 제 경우 (리눅스)에서는 다음과 같습니다 :

    /var/log/apache2/error.log
    
  13. ==============================

    13.

    나는 같은 문제에 부딪혔다. 그리고 그것이 내 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 비트입니다.

  14. ==============================

    14.

    enable_post_data_reading = On에 php.ini 파일을 확인하십시오 :

    http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading에서

  15. ==============================

    15.

    나는 같은 문제를 겪었고 어떤 주제도 내 실수가 아니었다. "MultiViews"가 활성화되어 있으면 .htaccess 파일이 있는지 확인하십시오. 나는 그들을 무력화시켜야했다.

  16. ==============================

    16.

    기본 스크립트가 http : //Some_long_URL/index.php 인 경우 action 필드에 전체 URL (http : // Some_long_URL뿐만 아니라 명시 적 index.php 포함)을 지정하십시오. 놀랍게도, 그렇지 않다면 올바른 스크립트가 실행되지만 빈 $ _FILES와 함께 실행됩니다!

  17. ==============================

    17.

    나는 비슷한 문제가 있었고 shamittomar가 언급 한 것처럼 문제는 htaccess에서 잘못된 값을 가지고있었습니다.

    php_value post_max_size 10MB를 php_value post_max_size 10M으로 변경하십시오.

  18. ==============================

    18.

    배치 한 후에 비어있는 $ _FILES이었습니다.

    </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>
    

    그래서 결론은 는 또는 다른 태그가되어서는 안됩니다

    내 상황에서 올바른 코드는

    <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>
    
  19. ==============================

    19.

    $ _FILES가 비어있는 경우에도 문제가 발생했습니다. 위의 체크리스트에는 .htaccess, httpd.conf 또는 httpd-vhost.conf의 MultiViews에 대한 언급이 없습니다.

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

  20. ==============================

    20.

    JQuery Mobile을 사용하는 경우

    Ajax는 파일 입력이있는 다중 파트 양식을 사용하지 않습니다. 이 경우 폼이 서버에 제대로 제출되도록하려면 부모 폼을 data-ajax = "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>
    
  21. from https://stackoverflow.com/questions/3586919/why-would-files-be-empty-when-uploading-files-to-php by cc-by-sa and MIT lisence