not bad 한 개발

CodeIgniter - 서버에 중복 없이 이미지 넣기 본문

Web/CodeIgniter

CodeIgniter - 서버에 중복 없이 이미지 넣기

leebean 2022. 2. 19. 16:24

파일 업로드 관련하여 코드를 제작하던 중 문득 파일의 이름이 중복되면 어떻게 해야 하나 생각했습니다, 그래서 여러 가지 방법을 시도해보았지만 빈 테이블 행을 하나 만든 후 그 안에 나중에 값을 넣는 방식으로 해보니 다행히 이미지 이름의 중복성도 사라지고 서버의 공간도 어느 정도 절약할 수 있었습니다.

이번 글에는 bootstrap 4.5 버전을 사용했습니다.

DB설계 (inimage테이블)

(위의 DB설계는 MariaDB 기준으로 제작했습니다.)

 

github : https://github.com/delight-HK3/Insert_image

 

GitHub - delight-HK3/Insert_image: Implemented so that images can be saved on the server without duplication of images in php la

Implemented so that images can be saved on the server without duplication of images in php language. - GitHub - delight-HK3/Insert_image: Implemented so that images can be saved on the server with...

github.com

(jQuery 및 bootstrap 파일도 첨부해놓았습니다.)

 

Controller

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Insert_image extends CI_Controller {
    function __construct(){
        parent::__construct();
        $this->load->database(); // 데이터 베이스를 연결합니다.       
        $this->load->model("insert_image_m"); // Insert_image_m model을 연결합니다.
        $this->load->library('upload'); // upload 라이브러리를 추가시킵니다.
    }
    public function index(){
        $this->add(); // 시작하면 add함수를 호출시킵니다. 
    }
    public function add(){
        $this->load->view("insert_image_view"); // insert_notice_view를 출력시킵니다.
    }
    public function insert(){
        $data = array( // insert_notice_view에서 입력받은 내용을 배열형태로 저장시킵니다.
            'name' => $this->input->post("name",true),
            'writer_no' => 1, 
            // 1을 넣은 이유는 make()함수에서는 writer_no의 값이 
       	    // 0인 행만 고르기 때문에 1을 안넣으면 추가하는 행 마다 writer_no의 값이 0이 됩니다. 
            // 결국 writer_no의 값이 0인 행을 선택하게 되고 처음에 넣은 값은 정상적으로 입력되지만/
            // 두 번째 부터는 빈 행이 들어가고 맨 앞에 있는 행이 갱신되는 문제가 생깁니다.
            'content' => $this->input->post("content",true)
        ); 
        
        $new["row"] = $this->insert_image_m->make(); 
        // insert_image_m에서 make함수를 실행시키고 리턴 값을 $new ["row"]에 저장시킵니다. 

        $picture=$this->upload($new["row"]->no); 
        // upload함수에 $new["row"]에 저장되어있는 no값을 넣어 호출합니다.
        if($picture){ // 이미지가 있으면 이미지의 이름을 반대로 없으면 img폴더에 저장되어있는 noimage.png를 배열에 저장시킵니다.
            $data["picture"]=$picture;
        }
        else{
            $data["picture"]="noimage.png"; // 이미지가 없으면 nonotice.png가 업로드 됩니다.
        }
        $this->insert_image_m->insert($data,$new["row"]->no);
        redirect("/insert_image");
    }
    public function upload($no){ 
        $config['upload_path'] = './img'; // 이미지 저장폴더 경로입니다.
	$config['allowed_types'] = 'gif|jpg|png'; // 저장할 파일의 타입입니다.
	$config['overwrite'] = TRUE; // 덮어쓰는 것을 허용합니다.
        $config['file_name'] = "img"."_".$no."_"."num"; 
        // 이미지의 이름을 지정하는데 img + "기본키 값" + num으로 이미지 이름을 저장시킵니다. 
	$this->upload->initialize($config); // 설정한 옵션들을 저장시킵니다.

        if(!$this->upload->do_upload('notice_img')){ 
        // 이미지 업로드에 성공하면 이미지 이름이 $data["picture"] 에 저장되고 안되면 아무것도 저장이 안 됩니다. 
           $picture="";
        }
        else{
           $picture=$this->upload->data("file_name");
        }
        return $picture; // 변수 picture을 insert에 리턴 시킵니다.
    } 
}
?>

 

Model

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class insert_image_m extends CI_Model {
    public function insert($data,$no){ 
    	// insert함수가 아닌 update를 사용하는 이유는 기존에 빈 테이블 행을 만들었기 때문에 
        // 빈테이블 번호와 같은 행을 view에서 가져온 값을 넣어 업데이트 합니다.
        $where=array("no"=>$no);
        return $this->db->update("inimage",$data,$where);
    }
    public function make(){ // 빈 값을 가진 행을 하나 만들고 그중에 writer_no 가 0인 행을 선택합니다.
        $sql1 = "insert into inimage(name, writer_no, content) 
                    values (null,0,null)";
        $sql2 = "select * from inimage where writer_no like 0";
        $this->db->query($sql1);
        return $this->db->query($sql2)->row();
    }
}
?>

 

View

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">

        <!-- bootstrap 4.5 css -->
        <link rel="stylesheet" href="/my/css/bootstrap.css">
        <link rel="stylesheet" href="/my/css/bootstrap.min.css">
    </head>
    <body>
        <div class="container">
            <form action="/drone/insert" enctype="multipart/form-data" method="post">
                <div class="row justify-content-md-center">
                    <div class="col-sm-3">
                        <div class="input-group mb-3">
                            <div class="input-group-prepend">
                                <label class="input-group-text">이름</label>
                            </div>            
                            <input type="text" name="name" class="form-control" required>              
                        </div>
                    </div>

                    <div class="col-sm-7">
                        <input type="file" value="" name="notice_img"> 
                    </div>

                    <div class="col-sm-10" style="margin-bottom: 30px">             
                        <textarea name="content"></textarea>
                    </div> 
                </div>    
                <div class="row justify-content-md-center">
                    <button type="submit" class="btn btn-outline-secondary" style="width: 20%; font-weight: bold">등록</button>
                </div>
            </form>
        </div>
    </body>
</html>
<!--bootstrap 4.5 Javascript-->
<script src="/my/js/jquery-3.6.0.js"></script>
<script src="/my/js/bootstrap.js"></script>
<script src="/my/js/bootstrap.min.js"></script>

(enctype="multipart/form-data" 를 작성안하면 이미지 업로드가 안됩니다.)

Comments