반응형

PHP로 FILE 업로드  

필요한 파일 

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

- index.php(파일 리스트)

- delete.php(삭제)

- download.php(파일 다운)

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

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

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


index.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
61
62
63
64
65
66
<html>
<head>
    <meta charset="utf-8"/>
    <title>file list</title>
</head>
<body>
<?php
$host = 'localhost';
$user = 'root';
$pw = '111111';
$dbName = 'opentutorials';
$mysqli = new mysqli($host, $user, $pw, $dbName);
 if(mysqli_connect_errno())
        {
            echo "DB connect error";
        }
        
        $sql = "select * from a";
        $res = $mysqli->query($sql);
        $num_result = $res->num_rows;
    ?>
    
    
    
    <table border='1' align="center">
        <thead>
            <tr>
                <th width="50">NUM</th>
                <th width="250">FILE</th>
                <th width="200">TIME</th>
                <th width="50">id</th>
                <th width="70">subject</th>
                <th width="250">memo</th>
                <th width="70">DOWN</th>
                <th width="50">DEL</th>
                
 
            </tr>
        </thead>
        <tbody>
            <?php
                for($i=0; $i<$num_result; $i++)
                {
                    $row = $res->fetch_assoc();
                    echo "<tr>";
                    echo "<td align='center'>".$row['num']."</td>";
                    echo "<td align='left'>
                <a href='./download.php?num=".$row['num']."'>".$row['name']."</a></td>";
                    echo "<td align='center'>".$row['time']."</td>";
                    echo "<td align='center'>".$row['id']."</td>";
                    echo "<td align='center'>
                <a href='./view.php?num=".$row['num']."'>".$row['subject']."</a></td>";    
                    echo "<td align='center'>".$row['memo']."</td>";
                    echo "<td align='center'>".$row['down']."</td>";    
                    echo "<td align='center'>
                <a href='./delete.php?num=".$row['num']."'>DEL</a></td>";                    
                    echo "</tr>";
                }
              mysqli_close($mysqli);
 
              
            ?>
            <input type = "button" name = "table" value ="글쓰기" onclick = "location.href='table.php'";>
        </tbody>
cs

이것인데요........ㅠㅠㅠ 저게뭐람... 

<?php
$host = 'localhost';
$user = 'root';
$pw = '111111';
$dbName = 'opentutorials';
$mysqli = new mysqli($host, $user, $pw, $dbName);
 if(mysqli_connect_errno())
        {
            echo "DB connect error";
        }
        

sql 연동 부분입니다.


$sql = "select * from a";
        $res = $mysqli->query($sql);
        $num_result = $res->num_rows;


$mysqli->query($sql); 이부분은 쿼리문을 이용해 sql 테이블 a 에 저장된 모든 데이터를 선택하여 쿼리 결과를 생성시킵니다. 

$res->num_rows; num_result에는 db결과가 몇개인지에 대한 정보가 들어갑니다.



<table border='1' align="center">
        <thead>
            <tr>
                <th width="50">NUM</th>
                <th width="250">FILE</th>
                <th width="200">TIME</th>
                <th width="50">id</th>
                <th width="70">subject</th>
                <th width="250">memo</th>
                <th width="70">DOWN</th>
                <th width="50">DEL</th>
                
 
            </tr>
        </thead>
        <tbody>


표의 굵기를 1(border='1')로 하여 가운데 정렬(align="center")하여 표를 만듭니다.

<th>내용</th>는 tale head의 약자로, 표의 제목을 쓰는역할입니다. (기본값 : 굵은글씨, 중앙정렬)

<tr>내용</tr>은 table row의 약자로, 가로줄을 만듭니다. (기본값 : 보통글씨, 왼쪽정렬)

<td>내용</td>는 table data의 약자로, 셀을 만드는 역할입니다. (기본값 : 보통글씨, 왼쪽정렬)


<tr>

<th>이름</th>

<th>나이</th>

</tr>

<tr>

<td>김영수</td>

<td>24</td>

</tr>


일경우


이름

나이

김영수

24

이렇게 된다는 말이죠 !



<?php
                for($i=0; $i<$num_result; $i++)
                {
                    $row = $res->fetch_assoc();
                    echo "<tr>";
                    echo "<td align='center'>".$row['num']."</td>";
                    echo "<td align='left'>
                <a href='./download.php?num=".$row['num']."'>".$row['name']."</a></td>";
                    echo "<td align='center'>".$row['time']."</td>";
                    echo "<td align='center'>".$row['id']."</td>";
                    echo "<td align='center'>
                <a href='./view.php?num=".$row['num']."'>".$row['subject']."</a></td>";    
                    echo "<td align='center'>".$row['memo']."</td>";
                    echo "<td align='center'>".$row['down']."</td>";    
                    echo "<td align='center'>
                <a href='./delete.php?num=".$row['num']."'>DEL</a></td>";                    
                    echo "</tr>";
                }
              mysqli_close($mysqli);
 
              
            ?>


for문을 이용해 총 num_result의 갯수($res->num_rows; num_result에는 db결과가 몇개인지에 대한 정보가 들어갑니다.) 만큼 테이블을 동적으로 생성하게 됩니다.

 $row = $res->fetch_assoc();

각 반복문이 돌아갈때마다 row변수에 select로 뽑아온 데이터가 배열로 저장됩니다.


echo "<td align='center'>".$row['num']."</td>"; 

row변수의 num에 저장되어있는 것이 입력 되겠죠


echo "<td align='left'>

<a href='./download.php?num=".$row['num']."'>".$row['name']."</a></td>";

파일의 name에 하이퍼 링크를 걸어(클릭시 download.php로 이동시키도록)줍니다.


mysqli_close($mysqli);

그리고 sql을 종료시켜줍니다.

결과입니다.




반응형
반응형

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이 첨부되어야만 전송이 될수 있도록 해줍니다.

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

^^




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





반응형
반응형

[Project1]로그인 구현하기 

완성한것 첨부파일 하였습니다. ^^

로그인실패시 창에 나오게 되는 starterror.php 또한 함께 첨부되었습니다.



htdocs.zip





htdocs.zip
0.0MB
반응형

+ Recent posts