일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 상속
- 옵셔널
- 함수
- 클래스
- 차이점
- bootstrap
- DatePicker
- pagination
- EC2
- amazon
- Gradle
- Java
- AWS
- class
- switch-case
- PHP
- Spring
- programmers
- CodeIgniter
- 자료불러오기
- SWiFT
- CKEditor4
- jQuery
- Xcode
- 객체
- guard
- 제어문
- 사용법
- 전의 의존성
- 2차원 객체배열
Archives
- Today
- Total
not bad 한 개발
CodeIgniter - 서버에 중복 없이 이미지 넣기 본문
파일 업로드 관련하여 코드를 제작하던 중 문득 파일의 이름이 중복되면 어떻게 해야 하나 생각했습니다, 그래서 여러 가지 방법을 시도해보았지만 빈 테이블 행을 하나 만든 후 그 안에 나중에 값을 넣는 방식으로 해보니 다행히 이미지 이름의 중복성도 사라지고 서버의 공간도 어느 정도 절약할 수 있었습니다.
이번 글에는 bootstrap 4.5 버전을 사용했습니다.
DB설계 (inimage테이블)
(위의 DB설계는 MariaDB 기준으로 제작했습니다.)
github : https://github.com/delight-HK3/Insert_image
(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" 를 작성안하면 이미지 업로드가 안됩니다.)
'Web > CodeIgniter' 카테고리의 다른 글
CodeIgniter - Pagination 구현 (0) | 2022.03.12 |
---|---|
CodeIgniter - 로그인 구현 (0) | 2022.02.18 |
CodeIgniter - DB에 있는 데이터를 Modal창 으로 보기 (0) | 2021.12.31 |
CodeIgniter - Ajax를 활용한 아이디 중복체크 (0) | 2021.12.29 |
CodeIgniter - 소개 (0) | 2021.12.29 |
Comments