PHP

파일 업로드

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
</head>	
<body>
<form enctype="multipart/form-data" action="1.php" method="POST">
   <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
   <input name="userfile" type="file" />
   <input type="submit" value="upload" />
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
</head>	
<body>
<?php
ini_set("display_errors", "1");
$uploaddir = 'C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\\';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "파일이 유효하고, 성공적으로 업로드 되었습니다.\n";
} else {
    print "파일 업로드 공격의 가능성이 있습니다!\n";
}
echo '자세한 디버깅 정보입니다:';
print_r($_FILES);
print "</pre>";
?>
</body>
</html>

댓글

댓글 본문
작성자
비밀번호
  1. 말봉
    업로드 파일의 확장자가 gif일 때만 true를 반환하고
    png와 jpg는 false를 반환하네요 훔...
  2. 안녕하세요
    다중 파일 업로드에 대한 내용도
    수업에 포함시켜 주세요!
  3. HongJu Shin
    hidden input 지우고 실행해보세요. 그래도 안 되면 file 디렉토리 이름의 f를 F로 바꿔서 실행해 보세요. 저도 같은 에러가 발생되었는데 위 방법처럼 하니까 업로드가 되네요. 저는 위에 두방법 다 사용해야 성공적으로 업로드가 되었는데 아마 주소 \file 중 \f 가 escape sequence로 인식되기 때문인 것 같기도 하네요.
    대화보기
    • Hyung Jun Choi
      한글파일명을 사용하실 경우에도 업로드가 정상적으로 이루어지지 않습니당 ㅎ
    • 코딩잘하고싶어요 ㅎ
      이게 굉장히 까다롭습니다. 저기 나와있는 코드 그대로 복제해서 여러분 에디터에 붙여넣기 하시면 100프로 오류 발생할걸요?? $uploaddir변수에 디렉토리 잘 점검하셔야 해요. 특히 htdocs\upload\file\ 이 부분 조심하셔야 해요.(upload 디렉터리 밑에 file디렉터리 없어도 오류 납니다.)
      그리고 닫히는 body태그 위에 img태그 써 주셔야 이미지가 나옵니다. "이미지가 안 나오고 파일 업로드 공격의 가능성이 있습니다." 이 부분이 나오는 이유는 아마 html파일에서 사이즈를 너무 작게 잡아서 그럴 가능성이 높습니다. 숫자 최대한 크게 하셔야합니다 .
    • Hyun Woo Lee
      열혈 강의 감사합니다.
      하지만 직접 코딩하는 중 한가지 문제점이 발생되었는데요.

      .txt와 .gif 형식의 파일으로 파일 업로드 시 프로그램이 정상적으로
      돌아가나, 이미지 파일의 경우 .jpg 형식으로 올렸을 때 error가 발생하네요
      .
      error 출력 시 max_file_size를 초과했다고 하는데, php.ini의 관련 설정을 변경해도
      동일한 error가 출력됩니다.

      어떠한 이유인지 알려주실 수 있나요!? 하루종일 메달리고 있네요...
    • shin
      파일을 업로드하는데 text파일은 업로드가 성공이 되는데 dng파일은 에러가 발생합니다
      파일 업로드 공격의 가능성이 있습니다!
      자세한 디버깅 정보입니다:Array
      (
      [userfile] => Array
      (
      [name] => 1.dng
      [type] =>
      [tmp_name] =>
      [error] => 2
      [size] => 0
      )

      이유를 모르겠습니다
    • 엽스
      다음 강의에 대해 질문 있습니다.
      위에 예제를 이용해서(1.html) 파일을 업로드 하고 1.php 서버로 전송 했을때

      다음과 같은 Warning이 출력 되고 file 폴더에는 임시 파일(C:\Windows/tmp/XXX.tmp)이 file 폴더에 복사 되있지 않은 문제 이더군요.
      권한 문제로 생각되어서 C:\Windows/tmp폴더도 권한을 다주고 file폴더에도 권한을 다주고 하물며
      bitnami Wamp Manager도 관리자 권한으로 실행해도 해결 되지 않더군요.

      도저히 원인을 찾지 못해서 글을 남김니다.

      참 항상 이고잉님 강의 잘 듣고 있습니다.^^ 감사합니다.

      (위닝메시지)
      Warning: move_uploaded_file(C:\Bitnami\wampstack-7.0.23-0\apache2\htdocs\PhpLecture\upload\file\20_플라스틱의자.jpg): failed to open stream: Invalid argument in C:\Bitnami\wampstack-7.0.23-0\apache2\htdocs\PhpLecture\upload\1.php on line 14

      Warning: move_uploaded_file(): Unable to move 'C:\Windows\Temp\phpC6C5.tmp' to 'C:\Bitnami\wampstack-7.0.23-0\apache2\htdocs\PhpLecture\upload\file\20_플라스틱의자.jpg' in C:\Bitnami\wampstack-7.0.23-0\apache2\htdocs\PhpLecture\upload\1.php on line 14
    • 송성태
      와, 정말 놀랐습니다.
      당연한듯 알았던 파일 업로드가 이렇게 복잡한 과정 위에서 실행되었군요.
      잘 봤습니다!
    • 최동희
      getcwd 함수를 이용해보는 건 어떨까 합니다. (테스트 해보진 못했어요, 제가 웹호스팅을 이용하지 않아서...)
      http://php.net......php
      대화보기
      • 다시시작
        일부 에러나서 다시 와서 봐야겠음. 일단 넘어감.
      • kimjs9105
        잘봣습니다~~ 감사합니다~~
      • sheis
        잘 봤어요^^
      • meek
        17-07-17 감사합니다.~
      • treehouse
        파일 섹션은 이전것들보다 어렵게 느껴졌다
        처음 코드만 봤을때는 이게뭔가싶고 길어서 그런지 이해조차 되지않았다

        하지만 하나하나 친절한 설명을 듣고나서 정말 너무나 심플한 코드였다는 생각이 들었다
        오늘도내일도 이고잉
      • 지나가던 행인
        바이트라고 하네요
        대화보기
        • 김세창
          문제점을 찾았다.

          원인 : $uploaddir = "C:\Bitnami\wampstack-7.1.0-1\apache2\htdocs\upload\file\\";

          이부분을 큰 따옴표로 되어있는데, 작은 따옴표로 바꾸니까. 잘 된다.
          또한 gif 파일만 된다.. 왜 그럴까.. 그거는 궁금하다.
        • Frank
          고맙습니다~
        • JoonKoo Kim
          https://www.drupal.org......ini

          php,ini의 설정이 post최대용량을 상한해서 파일업로드가 안되는 것일 수 있습니다. 참고해보세요.
        • 지선
          헉 너무감사합니다!!
          대화보기
          • park
            디렉토리에 들어가서 업로드된 파일에 들어가면 권한이 없다고 뜨네요
          • park
            성공적으로 업로드가 되었는데 깨지네요.. 왜이런것일까
          • 웹호스팅할때
            $uploaddir 변수에 경로입력할때 드라이브명부터 정확하게 입력해야한다고 이해했는데,

            웹호스팅업체를 통해서 할때는 그 경로값을 어떻게 알수있죠?
          • 신입1
            감사합니다
          • 덜렁이
            마지막줄에 이미지가 보이기 위해서는 1.php와 2.html 파일이 file폴더 바로 윗단계에 있어야 이미지가 보입니다.
            두단계 위에 있다면 아랫단계 폴더 이름을 넣어줘야합니다.
          • supreme_dk
            서버에서 php.ini 파일을 수정해보세요
            대화보기
            • NamJin Kim
              아 위치를 잘못선정했네요 됬는데 액박뜨고 파일 저장 위치가 htdoc upload 파일로 되어 있더라고요
              이거 위치를 바꿀수 는 없는건가요?
            • 엑박
              <img src='file/<?=$_FILES['addfile']['name']?>"/>에서 src="file 이부분 file이 파일 이름인것같네요 영상에는 upload로 파일을 만들어서 그런것 같습니다 그대로 file 쓰면서 upload 파일 이름을 바꾸니까 제대로 나옵니다
            • 몇몇분도 말했듯이 모든 부분을 완벽하게 하셨는데 사진이 엑박이 뜨시는 분들 계실거에요!

              음 파일 이름이 한글이면

              예를 들면 사진.png 라는 파일이 디렉토리에 가면 .png 로
              파일이름이 한글일 경우 깨지는 것 같아요!

              다시 파일 이름을 영어로 바꾸면 엑박이 안뜨고 정상적으로 작동하긴 하는데.

              이 문제에 대해 어떻게 해결해야 할까요??
            • 이정일
              웹서비스 만들기 강좌를 듣다가 파일 업로드 기능을 추가 시켜 보았습니다.
              업로드된 파일이 서버에 잘 저장은 되는데 업로드된 파일을 페이지에 어떻게 노출시키고 다운받게 해야 할지 잘 몰라서 문의 드립니다.
              웹 서비스의 경우엔 글 작성시 title, author, description이 DB에 저장이되고 불러올 수 있는데 title 별 업로드된 파일들을 확인할 수 있고 다운받도록 하신 분이 계시다면 참고할 만한 내용을 알려주셨으면 좋겠습니다.

              학습하면서 개발자의 노력도 많이 알 수 있고 저 또한 분발해야 겠다는 생각이 드네요.
              egoing 님 좋은 강의 감사합니다. ^^
            • 흠치치
              파일크기의 해결법은 없나요??
            • 행인
              http://docs.php.net......php 이곳에 바이트로 측정한다고 나와있네요.
              대화보기
              • 행인
                MAX_FILE_SIZE 의 value 값은 단위가 어떻게 됩니까?

                바이트일리는 없고 킬로바이트 단위인가요??
              • JustStudy
                고맙습니다
              • 굳은돌자리
                아옳(님) 감사합니다
                대화보기
                • 굳은돌자리
                  감사합니다. 아직 배우는 단계라 모두 이해해야 한다는 강박관념이 있어서......

                  강제지정한다고 생각하면 될것 같네요....
                  대화보기
                  • 아옳
                    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />

                    여기서 MAX_FILE_SIZE는 POST방식으로 보내는 file의 크기를 강제로 지정하는 것입니다.
                    MAX_FILE_SIZE는 있는 그래도 최대 파일크기라는 설정(?)의 이름이며 값은 value="30000"으로된 부분이 실질적인 값이라고 생각하시면 됩니다. 즉 "POST방식으로 보내는 file의 최대 크기를 30000으로 하겠다"라고 생각하시면 될것 같습니다.

                    여기서 MAX_FILE_SIZE를 따로 보낸다기 보단 file을 만들때 설정값을 넣어서 전송한다는 식으로 생각하시면 될 것 같아요.즉 업로드 되는 파일에 관해서는 모두 최대30000값 이하로만 전송 가능하다 라고 생각하시면 됩니다. 저도 초보라 제대로 설명했는지 모르겠네요 ㅎㅎ;
                    대화보기
                    • 굳은돌자리
                      input type에서 MAX_FILE_SIZE라는 값으로 POST형식으로 보냈는데 1.php의 어디에서 받는건가요?
                      1.php에서 어떤형식으로 받는건가 해서요

                      hidden으로 보냈으니 1.php에서 받는곳이 있을거라고 생각하는데요.....
                      $_FILES에서도 특별한 언급도 없는거같구......
                      모르겠네요

                      제가 초보라서요....아시는분 댓글 부탁드려요
                    • SK Kim
                      <?php ?> <?= ?> <? ?>은 모두 동일한걸로 아는데...
                      <?php ?>은 원래 작동하고, <? ... ?>은 php 설정 파일에서 short_open_tag = On 하면 작동 하는데..
                      <?= ?>은 작동을 안하네요. 음..
                      update :
                      해결 했습니다.
                      <? ?>은 php 설정을 고치면 되고, <?= ?>은 <?php ?>가 아닌 <?php echo ?>와 동일한 거네요.
                    • 허이짜다
                      웹호스팅으로해서 웹에 이 코드를 이용해서 이미지 업로드는 불가능한건가요?ㅠ 로컬호스트에서는 되는데, 파일경로를 웹 경로로 바꾸고 해서 웹호스팅에 올려서 하니 아래와 같은 문구만 뜨고 안되네요ㅠ 저기 에러코드가2번이면 파일 용량이 큰 거 때문이걸로 알고있는데, max사이즈도 충분하게 주었고, 똑같이 했을때 로컬에서는 되는데 웹호스팅에서만 안되네요..

                      파일 업로드 공격의 가능성이 있습니다!
                      자세한 디버깅 정보입니다:Array
                      (
                      [userfile] => Array
                      (
                      [name] => 1.jpg
                      [type] =>
                      [tmp_name] =>
                      [error] => 2
                      [size] => 0
                      )

                      )
                    • 동키신
                      <pre> tag의 기능을 검색해 보왔습니다.
                      기능: <pre>와 </pre> 로 감싸져 있는 구역의 text의 띄어쓰기나 줄바꿈을 유지

                      <pre> 없으면 연관배열의 값들이 일렬로 나오게 되네요.

                      참고하세요 ~^^;
                    • 참빛바다
                      검색해보니 basename이 한글 처리문제가 있더군요.

                      /* getbasename function : 한글파일이 잘려서 나타나는 문제 (ex> 안녕.ppt --> .ppt) 모든 basename() 함수를 getbasename()으로 대체 */
                      /* 출처 : http://dev.tattertools.com......t/7 */

                      function getbasename($path) {
                      $pattern = (strncasecmp(PHP_OS, 'WIN', 3) ? '/([^\/]+)[\/]*$/' : '/([^\/\\\\]+)[\/\\\\]*$/');
                      if (preg_match($pattern, $path, $matches))
                      return $matches[1];
                      return '';
                      }

                      basename을 이 함수로 대체하여 사용하니 작동은 잘 하는데..
                      원리는 좀더 공부해야 겠네요.
                    • 참빛바다
                      파일 이름에 빈칸이 있을때 저장이 제대로 안되네요.
                      해결법을 찾아봐야 겟어요.
                    • 저는 예제 소스를 직접 써서 했더니 실수를 많이 하는데요..
                      자꾸 결과가 null이라고 뜨는데 알고보니 $_FILES를 소문자로 쓰면 그렇더라구요,

                      여러분 힘내십시요. 저같은 놈도 합니다 ㅎㅎ
                    • Hyeon Kim
                      이미지 있는 파일이 2.html 인데 저는 맥북쓰고있는데 확장자가 html이여서 그런지 예제가 잘되지 않아 소스 보기를 했는데 php내용들이 제대로 실행안된거 같아서 이름을 2.php 로 바꾸고 했더니 잘되네염 ㅎ.ㅎ
                    • 2015-11-17화
                      어렵군요 ㅎ
                    • 박정호
                      첨부 화일 만들어서 적용해봤습니다.

                      서버는 집에 있는 컴퓨터를 쓰고있는데 윈도우7입니다.

                      실행해보았더니

                      Warning: move_uploaded_file(images/20130626_123854.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in C:\APM_Setup\htdocs\product\product.php on line 23

                      Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\APM_Setup\temp\phpFF3F.tmp' to 'images/20130626_123854.jpg' in C:\APM_Setup\htdocs\product\product.php on line 23

                      오류가 계속나오네요. 네이버에 검색하여 사용자 권한을 777로 변경하라고 하는데 알ftp로 보면 755 입니다.

                      소스는 $img=$_FILES['img']['name'];
                      $target=GW_UPLOADPATH.$img;
                      move_uploaded_file($_FILES['img']['tmp_name'],$target);

                      입니다. ㅜㅠ
                    • 오잉
                      음 ~ 다 아는 사실이겠지만..

                      한글이름 파일은 오류가 생기네요~

                      물론 사이즈 크기가 HTML 페이지에 있는 파일크기 사이즈 value 값 지정해놓은 것을 초과 하여도 오류가 생깁니다~


                      * 한글이름 파일은 오류가 생기는데 한글 이름 파일도 등록 가능하도록 하려면 방법이 있을까요..?
                    • 수풀가람
                      이부문이 지금까지 토픽중 가장 어려운 것 같습니다. upload된 파일의 권한이 문제가 되어서 지난 '파일제어'의 권한변경 강의를 다시 보았는데 이해가 않됩니다. Window상에서는 chmod() 를 사용하면 됩니까?
                    • gif확장명의 그림은 업로드가 되는데 png파일은 업로드가 안되네요
                      어떤 이유가 있을지 궁금합니다.
                    버전 관리
                    egoing
                    현재 버전
                    선택 버전
                    graphittie 자세히 보기