2010-08-17 10 views
23

다음 코드를 사용하여 로컬 컴퓨터에 파일을 성공적으로 업로드하고 있습니다. 내 로컬 컴퓨터에서 "성공적으로 업로드 됨"을 보여줍니다.PHP move_uploaded_file() 오류가 발생 했습니까?

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded"; 
} 

하지만 온라인 서버에서이 코드를 사용하면 파일을 업로드하지 않고 "업로드하지 못했습니다."라는 메시지 만 표시합니다.

문제점 및 문제점을 사용자에게 표시하려면 어떻게해야합니까? 웹 서버가 "이미지 /"디렉토리

+1

웹 서버에 이미지 폴더가 있습니까? 폴더가 읽기 전용입니까, 아니면 쓸 수 있습니까? – gabe3886

+0

PHP에서 생성 된 오류 메시지는 무엇입니까? $ moved를 사용할 필요가 없으므로 move_uploaded_file 명령을 명령문에 넣을 수 있습니다. – fabrik

+0

@all : 이것은 서버에 오류/경고를 표시하지 않는 문제입니다. 이미지 폴더가 존재하며 FileZilla를 사용하여이 폴더에 파일을 업로드 할 수 있습니다. – Awan

답변

33

확인하면 파일이 확인 업로드되었는지 확인합니까? max_post_size 또는 max_upload_filesize를 초과했을 수 있습니다. FileZilla를 사용하여 로그인 할 때 파일을 복사 할 때 PHP로 업로드 할 때이 파일이 apache (exaplme www-data)를 실행하는 사용자로부터 온 경우 이미지에 chmod 755를 넣으십시오.

+0

FileZilla를 사용하여이 폴더에 파일을 수동으로 업로드 할 수 있습니다. 즉, 권한이 있음을 의미합니다. 다른 가능성? – Awan

+10

FileZilla는 웹 서버에 권한이 있음을 증명하지 않습니다. 웹 서버는 사용자와 다른 사용자로 실행될 가능성이 큽니다. 권한이 있는지 확인하려면 권한을 777로 설정 한 다음 테스트하십시오. 권한 문제 또는 다른 문제인지 여부를 증명해야합니다. –

+0

chown -R 777 yourdirectory –

2

에 쓰기 권한이 있는지

16

어떻게 알 수있는 문제

간편한에게 무엇인지. 웹 서버의 오류 로그를 참조하십시오.

어떻게 사용자에게 표시 할 수 있습니까?

네버합니다.
일반 사용자는이 오류에 대해 아무런 이해도가 없습니다.
악의적 인 사용자는 특히 유익한 오류 메시지 형태로 피드백을받지 않아야합니다.

변명 거리를 표시하십시오.

서버의 오류 로그에 액세스 할 수없는 경우 작업이 더욱 복잡해집니다.
몇 가지 방법으로 연락하여 오류 메시지를 확인할 수 있습니다.

는 코드

ini_set('display_errors',1); 
error_reporting(E_ALL); 

에이 라인을 추가하거나 사용자 지정 오류 로그 파일

ini_set('log_errors',1); 
ini_set('error_log','/absolute/path/tp/log_file'); 

하기 위해 몇 가지 다른 방법이 화면에 오류 메시지를 표시합니다.
실제 오류 메시지 없이는 이동할 수 없음을 이해해야합니다.

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/"; 

if (is_dir($upload_dir) && is_writable($upload_dir)) { 
    // do upload logic here 
} else { 
    echo 'Upload directory is not writable, or does not exist.'; 
} 

이 즉시 모든 파일 권한 오류를 플래그합니다 : 그것은이 시도 어두운

+0

개발 사이트에서 오류를 표시해도됩니다. 오류를 로그 파일 (예 : 공유 호스팅)로 리디렉션 할 수있는 것은 아닙니다. –

+0

@Pekka 우리는 라이브 atm을 말하고 있습니다. 솔직히 이러한 호스팅은 즉시 포기해야합니다. –

30

에 장님 어렵다.

+0

그 중 일부는 아닙니다. 그리고 그러한 오류 처리는 쓸모가 없다. –

+12

정보가없는 사람들을 위해 정성을 기울여야하나요? –

+1

'업로드 디렉토리가 쓰기 가능하지 않거나 존재하지 않습니다.'라고 말합니다. 어떻게 해결되는지 설명해주십시오. –

1

또는 suexec을 실행하고 권한을 다시 변경할 필요가 없습니다.

5

move_uploaded_file() 반환됩니다 아파치 프로세스가 소스 또는 대상 디렉토리에 대한 읽기/쓰기 권한이없는 경우 파일 이름이

  • FALSE 및 오류 로그에 issue a warning 유효

    1. FALSE 경우

    PHP 오류 로그

    내 PHP는 오류 로그가 있었다 : /var/log/httpd/error_log 이러한 오류했다 :

    경고 : 인 move_uploaded_file (이미지/robot.jpg 일) : 스트림을 열지 못했습니다 :/var에/www /에서 HTML/내 사이트/mohealth에서 거부 권한을.() 인 move_uploaded_file : 라인에 78

    경고 PHP는 줄에 /var/www/html/mysite/mohealth.php에서 '이미지/robot.jpg'에서 '/ tmp를/phpsKD2Qm'을 이동할 수 없습니다 (78)

    move_uploaded_file() 임시 디렉터리에서 대상 디렉터리로 파일을 이동하려고합니다. 아파치 프로세스가 파일을 이동하려고 시도 할 때 임시 파일을 읽지 못하거나 대상 디렉토리에 쓸 수 없습니다.

    1. 사용자 아파치 (웹 서버) 사용자가이 명령으로 아파치 서비스를 실행하는 확인 실행 찾기 : ps aux | grep httpd합니다. 첫 번째 열은 사용자 이름입니다. 임시 디렉터리에서

    2. 확인 읽기 권한 : 귀하의 PHP를 페이지에 echo sys_get_tmp_dir();를 호출하여 임시 디렉토리의 경로를 찾을 수 있습니다. 아파치 사용자가 여기

    3. 을 쓰기 액세스 권한이 있는지 확인하기 위해 문제 ls -ld /var/www/html/destination-directory : 아파치 사용자가 대상 디렉터리에서 여기

    4. 확인 쓰기 권한을 읽을 수있는 액세스 권한이있는 경우 명령 줄에서, 문제 ls -ld /tmp/temporary-dir 확인합니다

      사용하여 chown 또는 chgrp

    5. 다시 시작 아파치를 사용하여 필요에 따라 권한을 추가 sudo service httpd restart

  • +0

    Windows에서 사용자를 확인하는 방법은 무엇입니까? – Black

    +1

    키워드 "source"로 문제가 해결되었습니다. 그것을보십시오 : "move_uploaded_file()은 FALSE를 반환하고 아파치 프로세스가 'source'또는 대상 디렉토리에 대한 읽기/쓰기 권한을 가지고 있지 않으면 에러 로그에 경고를 발행합니다." 따라서 프로젝트 디렉토리에 대한 모든 권한을 부여하는 것만으로는 충분하지 않으며 소스 파일의 위치에 대한 모든 권한을 부여해야합니다. – Hasan

    22

    편집으로 될 수있는 코드는 다음과 같습니다

    // Upload file 
    $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 
    
    if($moved) { 
        echo "Successfully uploaded";   
    } else { 
        echo "Not uploaded because of error #".$_FILES["file"]["error"]; 
    } 
    

    그것은 당신에게 다음 오류 코드 중 하나 일 8 값을 줄 것이다 :

    UPLOAD_ERR_INI_SIZE = 값 : 1; 업로드 된 파일이 php.ini의 upload_max_filesize 지시어를 초과합니다.

    UPLOAD_ERR_FORM_SIZE = 값 : 2; 업로드 된 파일이 HTML 양식에 지정된 MAX_FILE_SIZE 지시문을 초과합니다.

    UPLOAD_ERR_PARTIAL = 값 : 3; 업로드 된 파일의 일부만 업로드되었습니다.

    UPLOAD_ERR_NO_FILE = 값 : 4; 파일이 업로드되지 않았습니다.

    UPLOAD_ERR_NO_TMP_DIR = 값 : 6; 임시 폴더가 누락되었습니다. PHP 5.0.3에서 도입되었습니다.

    UPLOAD_ERR_CANT_WRITE = 값 : 7; 디스크에 파일을 쓰지 못했습니다. PHP 5.1.0에서 도입되었습니다.

    UPLOAD_ERR_EXTENSION = 값 : 8; PHP 확장 프로그램이 파일 업로드를 중단했습니다. PHP는 어떤 확장자로 인해 파일 업로드가 중단되었는지 확인하는 방법을 제공하지 않습니다. phpinfo()로로드 된 확장 목록을 검사하면 도움이 될 것입니다.

    0

    당신의 form 태그이 속성을 가지고 있는지 확인하십시오 :

    enctype="multipart/form-data"

    0
    $uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/'; 
    $profic = uniqid(rand()).$_FILES["pic"]["name"]; 
    
    if(is_uploaded_file($_FILES["pic"]["tmp_name"])) 
    { 
        $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic); 
        if($moved) 
        { 
         echo "sucess"; 
        } 
        else 
        { 
         echo 'failed'; 
        } 
    } 
    
    0

    을 가상 호스트에 disk quota을 확인합니다.

    할당량 초과시 move_uploaded_file 반환 오류입니다.

    추신 : 오랫동안 이것을 찾고 있었어요 :)

    관련 문제