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. 덜렁이
    마지막줄에 이미지가 보이기 위해서는 1.php와 2.html 파일이 file폴더 바로 윗단계에 있어야 이미지가 보입니다.
    두단계 위에 있다면 아랫단계 폴더 이름을 넣어줘야합니다.
  2. 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파일은 업로드가 안되네요
              어떤 이유가 있을지 궁금합니다.
            • 1111
            • 육점이
              감사합니다.
            • 후후
              이고잉님... 제가 정말 초짜라서 그러는데 너무 헷갈려서 질문합니다.

              이고잉님은 실습강의 하실때는 윈도우 서버에서 하시고 아마존 웹서비스 이용할 때는 리눅스 서버에서 개발하시는건가요?? 너무 헷갈려요......
            • 풋쳐핸졉
              아래 $_FILES의 정보에 error가 2로 표시되고 업로드가 실패하는 것은
              MAX_FILE_SIZE 보다 큰 사이즈의 파일을 올렸기 때문입니다.
            • 혹시 다들 아시겠지만 AWS같은 웹서버를 사용하시는 분들은
              $uploaddir = 'C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\\'; 를
              $uploaddir = '/var/www/html/'; 같이 변경하시면 됩니다.
            • 수정파일
              2.html 파일
              <!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 name="userfile2" type="file" />
              <input type="submit" value="upload" />
              </form>
              </body>
              </html>

              1.php 파일

              <!DOCTYPE html>
              <html>
              <head>
              <meta charset="utf-8"/>
              </head>
              <body>
              <?php
              ini_set("display_errors", "1");
              $uploaddir = 'C:\Bitnami\wampstack-5.4.36-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>";
              ?>
              <img src="<?=$_FILES['userfile']['name']?>" />
              </body>
              </html>

              //

              (C:\Bitnami\wampstack-5.4.36-0\apache2\htdocs\upload\file file폴더를 생성)
              (https://s3.ap-northeast-2.amazonaws.com......png)로 접속 마우스 오른쪽 클릭 이미를 (C:\Bitnami\wampstack-5.4.36-0\apache2\htdocs\upload 폴더에 저장 upload폴더에 (2.html, 1.php,94.png)저장 크롬브라우저 localhost/upload/2.html 입력

              wampstack-5.4.20-0\apache2--->wampstack-5.4.36-0\apache2 로 변경,

              이미지가 안보이는 경우 21번줄 <img src="file/<?=$_FILES['userfile']['name']?>" /> ----> <img src="<?=$_FILES['userfile']['name']?>" />로변경
            • sssssqew
              저는 일단 파일 크기 때문에 문제가 되어서 파일 크기를 늘렸구요.
              두번째로 img 태그 실행시 <?=" "?> 이렇게 하니까 이미지 업로드가 안되서
              <?php echo " " ?> 이렇게 바꾸니까 이미지가 성공적으로 업로드 되었네요. ^^
            • 쏘지
              img src에서 엑박이 뜨네요
              GET http://localhost......jpg 404 (Not Found) fileUp.php:20 이게 엑박 날때 오류고요

              절대경로로 고쳐봤지만 엑박 마져 없어지고 오류가 뜨네요
              Not allowed to load local resource: file:///C:/Bitnami/wampstack-5.4.32-0/apache2/htdocs//이미지이름.jpg

              이건 무슨상황인지..
            • jyonny
              같은 에러가 나서 한참을 찾다보니....2.html 에서 value 값이 문제가 아니였나 합니다.

              혹시 해결 못하신 분들 value 값을 늘려보세요 ㅎ아니면 전송 파일의 크기가 작은 것을 선택 하셔야 될듯.
            • JPARK
              if(move_uploaded_file($_FILES['userfile']['name'],$uploadfile) 을 if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile) 으로 바꾸고 난 후 정상 작동 되더라구요. 전자는 위의 소스코드에 쓰여져있는 것인데, 후자는 동영상 강의속의 소스코드였습니다.
              궁금한점이 있는데, 한글이름으로 된 사진 파일은 웹상에서 엑박이 뜨던데 해결방법은 없나요???
              직접 file디렉토리가서 확인해보았는데 .jpeg라는 파일명과 함께 열기하면 사진이 뜨더라구요.
              아래에서 제시한 사진표시를 눌러보았는데 뜨질 않았습니다.
            • chase
              localhost 를 통해서 하다보니까, 이게 업로드를해서 그걸 확인하는건지 아니면 단순히 파일 이름만 전달해서 그 파일을 본인 컴퓨터에서 확인하는건지 약간 헷갈리네요..

              이미지 출력이 안되시는분은 이미지 오른쪽버튼으로 누르셔서 view-image를 해보시면 not found 라는 메시지가 나오고 아래 경로가 있습니다. 경로를 보시고 상위 경로이면 앞에 ../ 를 붙이고, 그렇지 않으면 그에 맞게 경로를 써주시면 됩니다.

              처음에 <img src = "file/ ~~ " 이렇게 되어있길래 저는 이게 파일을 다루는 명령이구나 .. 라고 착각했었답니다ㅋ
              단순 경로입니다. " " 사이에 이미지의 경로를 써주시면 될듯합니다.
            • Daniel
              전 C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\에서 \를 안쓰고 /를 쓴 후,
              $uploadfile = 'upload/' . basename($_FILES['userfile']['name']);로 바꾸고 (upload는 수동으로 만듬)
              <img src="upload/<?=$_FILES['userfile']['name']?>"/>로 하니 되는군요. 웹호스팅은 다른건가요 이고잉님?
              아.. 그리고 마지막 img태그에서 src="upload/<?= 에서 =은 어떤 용도인가요? 찾아봐도 잘모르겠어요 ^^;;;
            • 0132h
              변함없습니다..
              vardump($FILES)로 불려내여 소스를 보면 다음과 같습니다.
              tmp_name값도 없네요..ㅠㅠ

              <!DOCTYPE html>
              <html>
              <head>
              <meta charset="utf-8"/>
              </head>
              <body>
              array(1) {
              ["userfile"]=>
              array(5) {
              ["name"]=>
              string(6) "b5.jpg"
              ["type"]=>
              string(0) ""
              ["tmp_name"]=>
              string(0) ""
              ["error"]=>
              int(2)
              ["size"]=>
              int(0)
              }
              }
            • egoing
              디렉토리를 수동으로 만들고 다시 해보셔요
              대화보기
              • 0132h
                디렉토리조차 존재하지 않습니다.ㅠㅠ
              • egoing
                아래와 같은 디렉토리가 실제로 있는지 한번 확인해보시겠어요?
                C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\
                대화보기
                • 0132h
                  안녕하세요. 항상 많은 도움을 받고 있습니다.
                  실행결과가 이렇게 나오는 데요.. 뭐가 잘 못인지....ㅠㅠ
                  Warning: move_uploaded_file(C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\pu.jpg): failed to open stream: No such file or directory in C:\Bitnami\wampstack-5.4.29-0\apache2\htdocs\upload\1.php on line 13

                  Warning: move_uploaded_file(): Unable to move 'C:\WINDOWS\Temp\php569.tmp' to 'C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\pu.jpg' in C:\Bitnami\wampstack-5.4.29-0\apache2\htdocs\upload\1.php on line 13

                  파일 업로드 공격의 가능성이 있습니다!
                  자세한 디버깅 정보입니다:Array
                  (
                  [userfile] => Array
                  (
                  [name] => pu.jpg
                  [type] => image/jpeg
                  [tmp_name] => C:\WINDOWS\Temp\php569.tmp
                  [error] => 0
                  [size] => 15752
                  )

                  )
                • egoing
                  파일이 너무 큰 경우 거절 될 수 있습니다. error 코드가 2번인 것으로 보니 그 문제인 것 같습니다. http://stackoverflow.com......r-2
                  대화보기
                  • dubi
                    실행 시켰을땐 어떤 사진은 업로드 되고 어떤사진을 업로드가 되지 않습니다
                    밑에 $_file정보를 보면 tmp_name과 size값이 안 나와 있더라구요 사진마다 다른 이유가 뭘까요?
                    파일 업로드 공격의 가능성이 있습니다!
                    자세한 디버깅 정보입니다:Array
                    (
                    [userfile] => Array
                    (
                    [name] => g.jpg
                    [type] =>
                    [tmp_name] =>
                    [error] => 2
                    [size] => 0
                    )

                    )
                  • 신나무
                    움..25일이나 지났으면 bara님은 성공 하셨겟죠 ㅎㅎ
                    음 저도 님처럼 공부하면서 홈페이지를 완성해나가고 있는데욤~
                    소스에 문제가 없었고, 경로에도 문제가 없었다면,
                    아마도 file폴더의 권한 설정에 문제가 있지 않나 싶네요!
                  • bara
                    이고잉님. 저는 생활코딩에 이어 php를 공부하고 있습니다.
                    아마존 웹서버를 사용하고 있고, 거기에 리눅스 설치해서 이번 강의를 실습하고 있습니다.

                    저의 경우는 이 코딩이 해당이 안되는 것 같아서요.
                    $uploaddir = 'C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\upload\file\\';

                    저는
                    제 ec2 주소를 치고나서 \var\www 후에 upload\file을 쳤습니다.

                    안되어서 터미널로 ec2로 들어가 mkdir로 upload\file을 만들었구요.

                    그런데도 업로드가 안되네요. 당연히 해당 폴더에 아무 파일도 없구요.
                    무엇을 고쳐야 할까요?
                  • sSll바버미니llSs
                    저도 몇칠을 고생했는데 혹시..저같은 실수를 하신게 아닌가해서요.

                    9번 Line
                    $uploaddir = 'C:\Bitnami\wampstack-5.4.26-0\apache2\htdocs\CodingEverybody\Upload\\';

                    21번 라인
                    <img src="file/<?=$_FILES['userfile']['name']?>" />

                    이미지가 엑박이 계속떴는데 9번 경로의 upload파일안에 file 이라는 폴더를 만들어서 거기에 이미지를 넣으니 되더라구요. 저는 경로가 문제였습니다.
                    대화보기
                    • egoing
                      여러가지 이유가 있을 수 있기 때문에 알려주신 정보만으로는 도움을 드리기 어렵습니다.
                      우선 아래 메뉴얼을 링크해 드릴께요.
                      http://docs.php.net......php
                      대화보기
                      • 호호
                        이고잉님 코드를 그대로 복사해서 붙여넣기 후 경로만 수정해줬는데 업로드가 되지 않는 이유는 무엇일까요 ㅠ


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

                        ) 이라고 뜨네요 흑흑
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기