2013-03-05 4 views
3

파일 업로드 페이지가 있는데,이 문제의 원인을 찾기 위해 코드별로 한 행 씩 점진적으로 디버깅 라인을 삽입했습니다. 문제는 코드 블록 어딘가에 발생PHP move_uploaded_file이 작동하지 않지만 오류가 발생하지 않았습니다.

 $tmp_name = $_FILES['image_large']['tmp_name']; 
     chdir('..'.DIRECTORY_SEPARATOR.'photos'); 
     $name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name'];   
     $success = move_uploaded_file($tmp_name,$name); 
     $errormsg = "<p>source: {$tmp_name}</p><p>destination: {$name}</p>"; 
     $errormsg .= "<p>error: {$success}</p>"; 

$errormsg 페이지에 인쇄됩니다, 다음과 같은 결과가 표시됩니다

source: C:\xampp\tmp\php4A14.tmp

destination: C:\xampp\htdocs\photos\fingerlakes1.jpg

error: 1

편집 : 위의 정말 혼란, 그래서 나를 명확히하자 . "오류 : 1"은 $ _FILES [ 'image_large'] [ '오류']를 참조하지 않습니다. move_uploaded_file이 작동했는지 여부를 참조하는 부울입니다. 따라서 1을 얻는 것이 바람직한 결과입니다.

대상이 파일의 올바른 위치입니다. 그러나 디버깅 결과가 컴퓨터가 작업을 성공적으로 수행했다고 확신한다고해도 "C : \ xampp \ htdocs \ photos \ fingerlakes1.jpg"파일이 생성되지 않습니다.

폴더가 쓰기 권한을 사용하도록 설정했는지 (Windows 7), $success이 사실로 평가되지 않았다고 생각하지만 생각합니다.

편집 : 나는 또한 모든 것을 확인 print_r($_FILES)를 사용했는데, 그것은 반환 :

Array ([image_large] => Array ([name] => fingerlakes1.jpg [type] => image/jpeg [tmp_name] => C:\xampp\tmp\php5694.tmp [error] => 0 [size] => 497376) [image_thumb] => Array ([name] => fingerlakes1.jpg [type] => image/jpeg [tmp_name] => C:\xampp\tmp\php5695.tmp [error] => 0 [size] => 26228))

그래서이 파일이 최소한의 TMP 폴더에 제대로 업로드 것으로 보인다.

편집 2 : 도움이 될 경우 추가 정보 : XAMPP 제어판을 관리자 모드로 실행하면서 XAMPP을 사용하고 있습니다. 현재 로컬 테스트 중입니다. 즉, 파일 업로드는 내 컴퓨터의 한 부분에서 다른 부분으로 파일을 복사해야합니다. 대상 폴더 인 "사진"과 "미리보기 이미지"에 들어가서 오른쪽 클릭 -> 속성 -> 보안을 클릭하고 목록에있는 모든 사용자가 쓰기 권한이 있는지 확인했습니다. 이 컴퓨터에는 단 하나의 계정 만 있지만 계정 이름은 사용자와 관리자, SYSTEM과 다른 하나는 잊어 버렸습니다. 그러나 나는 그들에게 안전한쪽에 있기 위해 모든 쓰기 접근 권한을 주었다.

EDIT 3 : 요청에 따라이 게시물의 맨 위에있는 첫 번째 코드 상자의 일부 코드를 바꾸어서 chdir 및 getcwd 행을 리터럴 경로 + 대상 파일 이름으로 바꾸십시오. 코드는 현재 다음과 같습니다.

 $tmp_name = $_FILES['image_large']['tmp_name']; 
     //chdir('..'.DIRECTORY_SEPARATOR.'photos'); 
     //$name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name']; 
     $errormsg .= "<p>source: {$tmp_name}</p>"; 
     $errormsg .= "<p>destination: C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg</p>"; 
     $success = move_uploaded_file($tmp_name,"C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg"); 

대상 문자열을 쓰는 백 슬래시에 이스케이프 시퀀스를 사용해야했습니다. 나는 그것을 처음부터 잊어 버렸고, 목적지 문자열이 엉망이되었음을 보여주는 페이지에 오류를 인쇄했습니다. 나는 $ tmp_name과 $ name 변수에 포함 된 백 슬래시에 문제가 없다고 가정하고 있습니다. 그 경우에는 에러를주지 않았기 때문입니다.

Windows가 디렉토리 분리 기호에 백 슬래시를 사용하고 인터넷이 슬래시를 사용한다는 사실에 문제가 있는지 궁금합니다. 아마 ... XAMPP에서 슬래시가 예상됩니까? 많은 사람들이 자신의 코드를 테스트하기 위해 XAMPP를 로컬로 사용하기 때문에 이것이 문제는 아닌지 나는 의심 스럽다.

EDIT 4 : 발견 된 문제의 원인 : 내 컴퓨터의 모든 단일 폴더에 "읽기 전용"으로 체크 표시된 체크 상자가 있음을 발견했습니다. 이 PHP 문제를 제외하고 컴퓨터에서 아무것도하지 못하게 막지는 못했지만 어쨌든 봤습니다.발견 : http://itexpertvoice.com/home/fixing-the-windows-7-read-only-folder-blues/

Windows 버그 인 것 같지만 Windows는 일반적으로 읽기 전용 설정을 무시합니다. 그러나 move_uploaded_file 문제가이 문제와 관련이 있을지 궁금합니다. 해당 페이지에서 몇 가지 솔루션을 시도하고 다시보고하겠습니다.

EDIT 5 : 실제로 코드에 문제가 없다는 것과이 문제가 Windows와 관련이 있다고 생각하기 시작했습니다. 내가 언급하지 못한 한 가지는 원래 XAMPP가 설치된 다른 하드 드라이브에있는 모든 사이트 파일을 원래 가지고 있었으며 파일 업로드가 제대로 작동했으며 새 드라이브로 이동 한 이후 코드가 변경되지 않았습니다. 유일한 다른 점은 그 당시에는 이미지를 대상 폴더에 수동으로 놓은 다음 파일 업로드를 사용하여 (기본적으로 파일을 업로드하여 파일을 덮어 씀) 나머지 파일 업로드 양식을 사용하여 다음과 같이 쓸 수있었습니다. MySQL 데이터베이스. 그게 효과가 있었어. 현재 문제를 발견 한 이유 중 하나는 파일 업로드와 관련된 문제로 데이터베이스에 쓰는 코드가 차단되고 있다는 점입니다.

그래서 나는 몇 가지 다른 것들을 시도 할 것입니다. 첫 번째는 이전에 한 일을 정확히 테스트하는 것입니다. 파일을 원하는 위치에 놓은 다음 업로드 양식을 사용하여 파일을 덮어 쓰고 나머지 파일을 처리 할 수 ​​있는지 확인하는 것입니다. PHP 코드는 데이터베이스에 쓸 수 있습니다.

내가 점검 할 두 번째 것은 사이트의 관리 측면을 실행하는 데 필요한 모든 PHP/HTML 파일과 함께 데이터베이스를 웹 호스트에 업로드하는 것입니다. 내 컴퓨터에서 로컬로 작동하지 않더라도 파일 업로드 양식이 정상적으로 작동 할 것이라는 잔소리를합니다.

나는 직장에서 집에 돌아와보고 할 때 이것을 시도 할 것이다.

+0

나는 그것이 당신의'chdir' 명령과 관련이있다 가정 것입니다. '$ name' 변수를 출력 해 보았습니까? 최종 디렉토리의 경로가 정확한지 확인하십시오. 또한'$ _FILES [ 'image_large'] [ 'name']'이미지의 이름을 가진 사용자를 신뢰하는 것은 매우 안전하지 않습니다. –

+0

테스트 중에 가장 중요한 것으로 설정된 오류보고가 없다면 다음과 같이 설정하십시오 :'ini_set ('display_errors', 1); ini_set ('error_reporting', 8191);'모든 오류를 확인합니다. –

+0

가능한 경우 chdir ('..'.DIRECTORY_SEPARATOR.'photos ') 대신 물리적 디렉토리 링크 (..없이)를 씁니다. – Agilox

답변

0

error code: 1을 받으면 에있는 PHP 구성에 정의 된 maximum upload limit을 초과했음을 의미합니다. 한도를 높이는 방법에는 두 가지가 있습니다. 1, php.ini (post_max_size) 또는 2를 수정하는 경우 ini_set()을 사용합니다.

파일을 업로드 할 때 항상 if 문을 사용하면 필요한 경우 적절한 오류 처리를 수행 할 수 있습니다. 예를 들어

:

if(!move_uploaded_file($_FILES['image_large']['tmp_name'])){ 
    switch($_FILES['image_large']['error']){ 
     case 1: 
      echo "file to large"; 
      break; 
     case 2: 
      echo "file larger than set in form (MAX_FILE_SIZE)"; 
      break; 
     case 3: 
      echo "partial upload"; 
      break; 
     case 4: 
     default: 
      echo "file not uploaded (unknown)"; 
    } 
} 
+0

죄송합니다. '1'은 (는) move_uploaded_file() 결과입니다. '$ _FILES' 오류는'0'입니다. – ariefbayu

+0

오류는 0, 1이 아닙니다. 죄송합니다. 디버그 라인을 이렇게 작성하면 혼란 스럽습니다. "errors : 1"을 반환 한 부분은 실제로 $ success 값이며 true를 반환한다는 것을 의미하는 부울 값입니다. 배열에서 $ _FILES에 대한 내용을 볼 수 있습니다. 두 파일의 오류는 0과 같습니다. –

+0

걱정하지 않아도됩니다. 혼동하지 않으셔도됩니다. 코드를 보면 오류 메시지와 관련된 내용이 명확합니다. –

관련 문제