2013-04-23 2 views
0

서버에 여러 파일을 업로드하고 싶습니다.업로드 오류 - 파일을 쓸 수 없습니다.

필자가 볼 수있는 한 파일은 쓰기 가능하지 않습니다.

내 코드가 실제로 작동하고 파일을 업로드 할 수 있도록하려면 어떻게해야합니까?

PHP :

if(isset($_FILES ['uploaded_files'])) 
{ 

    foreach($_FILES['uploaded_files']['name'] as $key=>$value) 
    { 
      if(is_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key]) && $_FILES['uploaded_files']['error'][$key] == 0) 
      { 

       $filename = $_FILES['uploaded_files']['name'][$key]; 

       if (is_writable($filename)) { 
         echo 'The file is writable'; 
        } else { 
         echo 'The file is not writable'; 
        } 
       if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename)) 
       { 
       //code 
       } 
       else 
       { 
         die ('There was a problem uploading the pictures.'); 
       } 
      } 
      else 
      { 
      die ('There is a problem with the uploading system.'); 
      } 
    } 
} 

HTML : 당신은 당신이 최근에 업로드했지만 아직 저장되지 않은 파일에 쓰기 권한이 있는지 확인하는

<form enctype="multipart/form-data" action="upload.php" method="POST"> 
     <input type="hidden" id="input_clone_id" name="input_clone_id" value="'.$row['id'].'"/> 
     <input type="hidden" id="input_clone_var" name="input_clone_var" value="V"/> 
      <input type="file" name="uploaded_files[]" id="input_clone" multiple="multiple" /><br /> 
     <input type="submit" style="margin-left:0" value="Upload Files" /> 
</form> 

답변

1

두 가지 문제점이 있습니다. 첫 번째는 보안 문제이고 두 번째는 현재 보안 문제가 문제

의 원인이 무엇 아마도 :

$filename = $_FILES['uploaded_files']['name'][$key]; 
... 
if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename)) 
... 

문제을 : $filename는 $ _FILES 배열에서 온다 때문에,이 없습니다 신뢰할 수있다. 사용자는 자신의 사이트에 파일의 이름이 무엇인지 알려주었습니다. 그들은 당신의 스크립트가 흥미로운 방식으로 실패 할 수있는 가짜 파일 이름을 제공 할 수 있습니다. 어떤 식 으로든 사용하기 전에 해당 파일 이름을 삭제해야합니다.

문제 b : 사용자가 파일 이름을 지정할 수 있도록 허용함으로써 충돌하는 파일 이름을 지정하기 만하면 "images/gallery"디렉토리의 다른 파일을 덮어 쓸 수 있습니다. 이것을 피하는 방법은 데이터베이스를 사용하고, 업로드 된 파일의 고유 식별자를 생성하고, 고유 한 이름으로 파일을 저장하고, 데이터베이스에 원래 파일 이름 및 기타 정보를 기록하는 것입니다. 그렇게하면 원래 파일 이름이 무엇인지 항상 알 수 있고 다른 사람이 해당 디렉토리의 파일을 덮어 쓸 가능성이 없습니다.

쓰기 문제 : *

명세서 "쓰기 확인"잘못된 것입니다. 되돌아 오는 파일 이름은 사용자가 제출할 때 사용한 파일 이름입니다. 이것은 파일 시스템의 어떤 지점을 가리 키지 않을 것입니다 ... 여러분이 볼 수없는 지점 (때로는)을 가리 킵니다. 확인해야 할 것은 "../images/gallery"디렉토리가 $filename이 아닌 쓰기 가능하다는 것입니다. 실패 할 경우, 명령 행 액세스 권한이 있거나 서버와 통신하기 위해 FTP를 사용할 경우 사용중인 FTP 클라이언트를 통해 전역 쓰기 액세스 권한을 부여하는 경우 images 폴더에있는 동안 "chmod -R 777 gallery"를 수행해야합니다 .

그래서, 당신은 그 수표 대신이 있어야 무엇 :

if (is_writable("../images/gallery")) { 
    echo 'The file is writable'; 
} else { 
    echo 'The file is not writable'; 
} 

스크립트가 다시 와서 복사 할 수 있었어야했는데 그것은 "파일이 쓰기 가능"말한다면, 그 일을 한 후 이미지/갤러리 폴더에 파일을 저장하십시오 (사용자가 준 파일의 이름을 사용하지 마십시오). 그렇지 않은 경우 업로드 된 파일을 이동할 권한이 없습니다.

는 업로드 된 파일의 위치에 관해서는, 나는 스크립트 실행이 때때로을 종료 한 후이 삭제되어 가끔 생각하지만,하지 않을 경우, 파일의 'tmp_name' 에코 수 있으며, 해당 디렉토리에 가면 당신은 그것을 찾아야한다 거기 앉아. 파일이 실제로 서버에 도착했는지 확인하기위한 검증 테스트 일뿐입니다. 업로드 한 파일을 옮기는 디렉토리에서 쓰기 권한 (chmod 777의 내용)을 가지고 있다면 거기에 복사 할 수 있어야합니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 현재 로컬 호스트에서 작업 할 때 컴퓨터를 사용하고 있습니다. 쓰기 가능한 폴더인지 확인하는 방법을 알려줄 수 있습니까? –

+0

Windows 또는 Linux? –

+0

windows ......... –

1

, 나는 이러한 파일을 생각하지 않는다 이제까지 쓸 수있을 것이다. if를 제거하거나 업로드하려는 폴더가 쓰기 가능인지 확인하십시오.

그 외, 귀하의 코드를 검사 한 결과 작동합니다.

+0

문제는 내가 "업로드 한"폴더의 파일을 볼 수 없다는 것입니다. –

+0

'../images/gallery'경로를 에코하여 가리키는 부분을 확인하십시오. 정말 코드를 확인했는데 나에게 도움이되었지만 '../images/gallery'를 제거하고 $ filename –

+0

경로 만 남겼습니다. 문제는 파일이 업로드되지 않았으며 갤러리 폴더에 없습니다. –

관련 문제