반응형

PHP로 FILE 업로드  

필요한 파일 

- files( 파일이 저장될 파일)

- index.php(파일 리스트)

- delete.php(삭제)

- download.php(파일 다운)

- table.php(게시판 작성 양식)

- write.php(파일이 db에 저장되는 것을 처리)

- view.php(파일의 내용을 볼수 있는 곳)


전에 table.php에서 게시판에 작성하는 폼을 만들었고,

처리하기 위해 write.php로 action을 주었습니다.

그래서 이번에는 데이터를 mysql로 입력되도록 처리해주는 write.php를 만들겠습니다.


먼저 mysql에 만들어줄 테이블 입니다.


CREATE TABLE `a` (

  `name` varchar(255) NOT NULL,

  `num` int(10) NOT NULL AUTO_INCREMENT,

  `id` varchar(255) NOT NULL,

  `subject` varchar(255) NOT NULL,

  `memo` varchar(255) NOT NULL,

  `hash` varchar(255) DEFAULT NULL COMMENT 'hash',

  `time` datetime DEFAULT NULL COMMENT '시간',

  `down` int(10) DEFAULT 0 COMMENT '다운로드 횟수',

  PRIMARY KEY (`num`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8



AUTO_INCREMENT 는 숫자를 자동으로 증가시켜주는 것 입니다.

또한 datetime은 1000-01-01 00:00:00부터 9999-12-31 23:59:59저장하는 날짜저장 컬럼-8바이트 입니다.



time type

(23:01:01등의 시간:분:초를 저장 컬럼-3바이트)

 

date type

(1000-01-01부터 9999-12-31 저장하는 날짜저장 컬럼-3바이트)

 

year type

(1970~2069년도를 저장-1바이트)


PRIMARY KEY (`num`) 기본키로 num을 주었습니다.

기본키란, 중복되 등록되지 않도록 해주는 것입니다. 

보통 회원가입할때, id를 기본값으로 주어 id값을 중복되지 않도록 해줍니다.


다음으로 데이터를 sql로 저장되도록 처리해주는 파일(write.php) 입니다.


write.php

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<html>
   <meta charset="utf-8">
 
 
<?php
 
$host = 'localhost';
$user = 'root';
$pw = '111111';
$dbName = 'opentutorials';
$mysqli = new mysqli($host$user$pw$dbName);
 
    
$id = $_POST['id'];
$subject = $_POST['subject'];
$memo = $_POST['memo'];
$file = $_FILES['file']['name'];
 
 $date = date("YmdHis"time());
 $dir = "./files/";
 $file_hash = $date.$_FILES['file']['name'];
 $file_hash = md5($file_hash);
 $upfile = $dir.$file_hash;
 
 
 
if(is_uploaded_file($_FILES['file']['tmp_name']))
    {
            if(!move_uploaded_file($_FILES['file']['tmp_name'], $upfile))
            {
                    echo "upload error";
                    exit;
            }
    }
 
 
 
    
  $sql = "insert into a (name, id, subject, memo, hash, time)";     
  $sql = $sql"values('$file','$id','$subject','$memo','$file_hash','$date')"
  
    $result = $mysqli->query($sql);
    
    
    
    if(!$result)
    {
        echo "DB upload error";
        exit;
    }
    
    
mysqli_close($mysqli);
    echo("<script>location.href='index.php';</script>");
    echo "<script>alert('업로드 성공');";
 
 
    
    ?>
    </html>

cs



<?php
 
$host = 'localhost';
$user = 'root';
$pw = '111111';
$dbName = 'opentutorials';
$mysqli = new mysqli($host$user$pw$dbName);


mysql로 연동시켜주는 부분입니다.



$id = $_POST['id'];
$subject = $_POST['subject'];
$memo = $_POST['memo'];
$file = $_FILES['file']['name'];


이전에, tabel.php에서 post방식으로 전달해주었던  id와 subject와 memo와 file을 전달 받습니다.

여기서 눈여겨 봐야할 부분은

$file = $_FILES['file']['name'];

이부분인데요,

자세히 살표봅시다.

클라이언트 머신에 존재하는 파일의 원래 이름을 의미하겠죠~!




$_FILES['userfile']['name'] 

클라이언트 머신에 존재하는 파일의 원래 이름입니다.


$_FILES['userfile']['type'] 

브라우저가 이 정보를 제공할 경우에, 파일의 mime형식. 예를 들어 image나 gif..


$_FILES['userfile']['size'] 

업로드된 파일의 바이트로 표현한 크기


$_FILES['userfile']['tmp_name']

서버에 저장된 업로드 파일의 임시 파일 이름


$_FILES['userfile']['error']

파일 업로드에 관련한 에러코드 

 




 $date = date("YmdHis"time());
 $dir = "./files/";
 $file_hash = $date.$_FILES['file']['name'];
 $file_hash = md5($file_hash);
 $upfile = $dir.$file_hash;
 

 $date = date("YmdHis"time());
이부분은 data변수에 time함수에서 값을 뽑아내어 저장하는 부분입니다.

 $dir = "./files/";
디렉토리의 경로를 변수저장해주었습니다.

 $file_hash = $date.$_FILES['file']['name'];
date변수+ 파일제목으로 해시값을 만들기 위하여 변수저장해주었습니다.
왜 date를 합치냐면, 파일의 이름이 중복되는 해시값 중복을 피하기 위함입니다.

 $file_hash = md5($file_hash);
md5함수를 써서 해시화 시켰습니다.

 $upfile = $dir.$file_hash;
실제 파일이 업로드 되는 경로 입니다. (디렉토리경로 + 해시(날짜시간+파일이름))





if(is_uploaded_file($_FILES['file']['tmp_name']))
    {
            if(!move_uploaded_file($_FILES['file']['tmp_name'], $upfile))
            {
                    echo "upload error";
                    exit;
            }
    }



is_uploaded_file 은 파일이 HTTP 프르토콜의 POST방식을 통해 업로드되었는지를 확인해 줍니다. 
한마디로, 서버에 저장된 업로드 파일의 임시 파일이 post방식을 통해 업로드 되었는지를 확인해주는 것 입니다. 파일의 유무 확인
정상종류시 true를 아닐시 false를 반환합니다.

move_uploaded_file(임시파일명, 출력파일)은 업로드된 임시 파일을 출력 파일명으로 지정된 패스에 카피하는 것 입니다.
정상종류시 true를 아닐시 false를 반환합니다.

위에서 파일을 업로드 시키는 부분까지 완성했습니다.
이제 나머지 데이터들을 sql로 넣어보겠습니다.


$sql = "insert into a (name, id, subject, memo, hash, time)";     
  $sql = $sql"values('$file','$id','$subject','$memo','$file_hash','$date')"
  
    $result = $mysqli->query($sql);
    
    
    
    if(!$result)
    {
        echo "DB upload error";
        exit;
    }
    
    
mysqli_close($mysqli);
    echo("<script>location.href='index.php';</script>");

 쿼리문을 이용하여 입력받은 데이터들을 sql로 넣었고, 그 결과가 잘들어가지않았을때 "DB upload error"가 뜨도록 했습니다.

그리고 sql을 종료 시켰습니다.


그리고 곧장 


    echo("<script>location.href='index.php';</script>");

이것은 페이지를 자동으로 넘겨주는 부분입니다. 우리는 table.php에서 입력받은것을 sql로 넣기 위해 처리하는 부분을 다했을때, 바로 index.php로 넘어갑니다.



결과 입니다.



반응형
반응형

PHP로 FILE 업로드  

필요한 파일 

- files( 파일이 저장될 파일)

- index.php(파일 리스트)

- delete.php(삭제)

- download.php(파일 다운)

- table.php(게시판 작성 양식)

- write.php(파일이 db에 저장되는 것을 처리)

- view.php(파일의 내용을 볼수 있는 곳)



가장 먼저, 게시판에 데이터를 넣기위한 부분입니다.


table.php

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
32
33
<html>
    <meta charset="utf-8"/>
    <title>게시판</title>
</html>
<body>
    <form action="write.php" method="POST" enctype="multipart/form-data" />
    <table  align= "center" >
    <col width=100></col><col width=100></col>
        <tr>
            <td>아이디:</td>
            <td><input type="text" name="id" /></td>
        </tr>
        <tr>
            <td>제목:</td>
            <td><input type="text" name="subject" /></td>
        </tr>
        <tr>
            <td>내용:</td>
            <td><textarea name="memo" rows="20"></textarea></td>
        </tr>
        <tr>
            <td>첨부파일:</td>
            <td><input type="file" id="file" name="file" required /></td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="전송" />
            </td>
        </tr>
        </table>
    </form>
</body>
</html>
cs


 <form action="write.php" method="POST" enctype="multipart/form-data" />

file을 업로드 하기 위하여 꼭 설정해줘야 하는 부분 enctype="multipart/form-data" 입니다. 꼭!

form 양식의 enctype 은, 

<enctype> 

1. application/www-form-urlencoded

디폴트값이다. enctype을 따로 설정하지 않으면 이 값이 설정

2. multipart/form-data

파일이나 이미지를 서버로 전송할 경우

3. text/plain

이 형식은 인코딩을 하지 않은 문자 상태로 전송할 경우



    <table  align= "center" >

  표를 가운데로 정렬하고 싶다는 의미입니다.

<table align="left|right|center"> 왼쪽|오른쪽|가운데 이렇습니다.




<col width=100></col><col width=100></col>

<col width="pixels|%|relative_length">의 형태로 쓰는데요,

pixels의 경우 : width = "50"

%의 경우 : width = "50%"

relative_length의 경우 : "1*"

사실 저도 이해가 잘 가지 않지만,, 넣어보니 좀더 정리된 기분이 들어.. 넣긴넣었습니다. 

더욱 공부하여 올리겠습니다...^^





<tr>
            <td>아이디:</td>
            <td><input type="text" name="id" /></td>
        </tr>
        <tr>
            <td>제목:</td>
            <td><input type="text" name="subject" /></td>
   </tr>


아이디와 제목의 경우 input type은 text로 받았습니다.





<tr>
            <td>내용:</td>
            <td><textarea name="memo" rows="20"></textarea></td>
        </tr>


<td><textarea name="memo" rows="20"></textarea></td> 이부분을 보시면,

텍스트 필드가 한줄만 입력할 수 있는것에 비해 텍스트에어리어(textarea)는 여러줄에 걸쳐서 입력할 수 있는 폼 필드입니다.

기본적으로 텍스트에어리어(textarea)의 너비와 높이를 지정하기 위해서 rows와 cols 속성이 사용됩니다.

기본값을 주고싶은경우

<textarea rows="5" cols="30" name="contents">이곳에 적어주십시오.</textarea> 이런식으로 주면 됩니다.





        <tr>
            <td>첨부파일:</td>
            <td><input type="file" id="file" name="file" required /></td>
        </tr>


<td><input type="file" id="file" name="file" required /></td>

첨부파일의 경우에는 input type를 file로 받아주세요.

이곳에서 id와 name부분이 있는데요,

name은 page안에서 중복되어 사용이 가능하며 action에 해당하는 페이지로 전달하는 파라미터로 사용됩니다.

id는 page안에서의 중복 사용이 불가능하며 주로 javascript에서 다룰려고 지정하는 것 입니다.

따라서 잘모르겠다면, 저처럼 두개다 써주세요 ^^


retuired 이것도 중요합니다.

저것을 써줌으로써, file이 첨부되어야만 전송이 될수 있도록 해줍니다.

없애면, 첨부파일없이도 등록이가능해지겠죠! 

^^




결과입니다. 좀...못생겼네요 ㅠㅠ 





반응형
반응형

PHP로 FILE 업로드 하기....... 에 앞서 만들기위해 필요한 개념에 대한 공부를 먼저 하겠습니다. ^^



저는, 생활코딩이라는 사이트에서 공부를 하고 있습니다.

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<!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>
cs


결과창은 다음과 같습니다.




음...............

파일을 업로드 할때 <form>태그에서 ENCTYPE="multipart/form-data"라는 애트리뷰트를 반드시 써야 합니다.

왜냐면, 그렇게 안하면, 웹서버로 데이터를 넘길때 파일의 경로만 전송되고 파일의 내용이 전송이 되지 않는다고 합니다.

또, mehod를 post로 주는것또한, 중요합니다.

 



<form>태그의 속성인 method, action, enctype 등은 입력받은 데이터를 어떻게 처리할 것인지 세부적으로 설정하는 데 사용됩니다.

  method는 전송 방식

  action은 전송 목적지

  enctype은 전송되는 데이터 형식

 



enctype

enctype 속성은 다음과 같습니다.

1. application/www-form-urlencoded

디폴트값으로, enctype을 따로 설정하지 않으면 이 값이 설정됩니다. 폼데이터는 서버로 전송되기 전에 URL-Encode 됩니다.

2. multipart/form-data

파일이나 이미지를 서버로 전송할 경우 이 방식을 사용합니다.

3. text/plain

인코딩을 하지 않은 문자 상태로 전송합니다.






다음 이부분을 봅시다.<input type="hidden" name="MAX_FILE_SIZE" value="30000" />


type="hidden"

- 숨겨진 입력필드를 정의

  즉, 화면상에 폼에는 보이지 않지만, 폼을 서버로 전송할 때 함께 전송되는 요소

- 예를 들어, 회원가입 폼에서 가입 경로, 날짜와 같이 굳이 사용자가 입력하지 않아도 알 수 있는 정보들을 서버로 넒길때 사용


<input type="hidden' name="..." value="서버 전송 값"/> 으로 사용됩니다. 


이코드의 경우, 사용자가 전송한 파일의 최대 크기를 정하기 위해 사용한다고 합니다.

php.ini의 file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size 지시어를 참고하십시오. 




또한 중요하게 알아야 할 것은,

<input type="hidden" name="MAX_FILE_SIZE" value="30000" /> 이

   <input name="userfile" type="file" /> 보다 앞에 써있어야 한다는 것 입니다.



반응형

+ Recent posts