티스토리 뷰

[PHP] 파일 업로드 (AJAX, XMLHttpRequest나 form 등으로 file 첨부), 에러나는 이유와 처리 방법


* 클라이언트 측 파일 업로드는 이전에 다뤄봤으니 이번에는 서버측 PHP에서 어떻게 파일을 다룰지 한번 알아보고 파일 업로드를 하게 될 때 일어나는 에러들의 이유와 그 처리 방법을 살펴보자.


: 클라이언트 부분은 이전에 작성했던 글을 참고하면 될 것이다.


2012/10/10 - [Programming/Web Programming] - [Javascript] AJAX 비동기로 파일 첨부하기 (IE도 지원하게 만들기)


: 솔직히 클라이언트쪽 세팅만 잘해줬으면 PHP 쪽은 할일이 거의 없다. 만약 올리는 쪽에서 input의 name이 "uploadFile"이라고 했다면, PHP쪽에서는 그 파라미터로 동일하게 가져오면 된다.


<?php

$file = $_FILES["uploadFile"];

?>


: 끝이다. 정말로 파일을 가져온 것이다. 하지만 현재는 임시 파일 명으로 되어있으니 그 파일을 가져다가 다른 곳에 옮겨 놓는 것도 좋다. 임시 파일은 보통 '/tmp/A3DCf' 이런식으로 임시 폴더에 올라와있다.


<?php

$uploadDir = './uploads';

$file = $_FILES["uploadFile"];

$tmp_name = $file["tmp_name"];

$name = $file["name"];

move_uploaded_file($tmp_name , "$uploadDir/$name");

?>


: 그렇다면 $_FILES의 내용은 아래와 같다.


$_FILES['uploadFile']['name'] : 클라이언트에서 올린 원래 이름

$_FILES['uploadFile']['type'] : 파일의 종류. "image/gif" 이런식으로 구성

$_FILES['uploadFile']['size'] : 업로드한 파일의 크기. 단위는 byte

$_FILES['uploadFile']['tmp+name'] : 파일의 임시 이름. 현재 서버에 업로드되어있는 위치.

$_FILES['uploadFile']['error'] : 에러코드. (참고 : 에러코드 레퍼런스)


: 하지만 만약에 파일처리를 하다가 이유없이 에러가 나거나 $_FILES["uploadFile"]가 비어있다는 것을 알게 된다면 무언가가 잘못 된 것이다. 아래와 같이 정리를 해보았다. 다음 중 하나일 확률이 매우매우 높다.

1. php.ini 파일의 설정 확인

: file_uploads = On 으로 잘 설정되었는지, post_max_size와 upload_max_file_size가 충분히 큰지 확인. 혹시 용량에 오탈자가 (8M 이 아니라 8MB!) 있는지 확인

: 참고

2012/10/08 - [Programming/Web Programming] - [PHP] php.ini의 위치

2012/10/08 - [Programming/Web Programming] - [PHP] 크기가 큰 파일이 첨부되지 않을 때, $_FILES[]가 비었을때, 첨부 파일크기 제한 늘리기


2. form 태그에 enctype="multipart/form-data"의 attribute를 제대로 추가했는지 따옴표도 중요하다. 다른 곳에서 복사 붙여넣기를 하면 다른 모양이 들어가는 경우에도 안될수도 있다.

* AJAX, XMLHttpRequest를 이용하는 경우에 파일을 첨부하면 자동으로 설정이 된다.


3. 자바스크립트로 input을 disable 시키지 않았는지 확인. (수정 불가능하게 하려는 경우 이렇게 하는 경우도 발생함)


4. tmp 디렉토리와 upload 디렉토리의 쓰기 permission이 제대로 설정되어있는지 확인. chmod로 설정 변경하기. 충분한 용량을 확보해줬는지 확인.


5. form 태그의 method="'post" 가 맞는지, get방식은 파일 첨부가 안된다.


6. tmp/upload 파일이나 파일을 쓰고자하는 위치나 이름에 빈칸이 없는지 확인.


7. <form> 태그가 제대로 </form> 태그로 닫혔는지 확인


8. <input type="file"> 태그에 name을 설정해줬는지 확인! * id는 안된다!!



: 8번 때문에 몇시간을 낭비했던적이 있다. 조심하자!



* PHP로 파일 업로드 처리하기 끝.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함