웹(php)/웹(file)_php

[Project 2]PHP로 FILE 업로드_write.php(파일이 db에 저장되는 것을 처리)

byeol2ing 2016. 11. 8. 18:46
반응형

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로 넘어갑니다.



결과 입니다.



반응형