전에 쪽지에 첨부파일보내기 하는 스킨혹은 팁 같은거 본적이있는데

전에 쪽지에 첨부파일보내기 하는 스킨혹은 팁 같은거 본적이있는데

QA

전에 쪽지에 첨부파일보내기 하는 스킨혹은 팁 같은거 본적이있는데

본문

전에 쪽지에 첨부파일보내기 하는 스킨혹은 팁 같은거 본적이있는데

정작에 찾자니까 없네요 

혹시 아시는분 답변 부탁 합니다.

이 질문에 댓글 쓰기 :

답변 1

없을 수도 있습니다.

그나마 찾은 건,
https://sir.kr/cmall/1478591343 (https://sir.kr/g5_plugin/2156)
입니다.

다음은 직접 구현하는 방법 정리입니다.

참고용이고, 정상 작동 여부는 확인하지 못했습니다.

 

먼저 memo 테이블에 파일 관련 필드를 추가해야 합니다:


ALTER TABLE g5_memo ADD me_file varchar(255) NOT NULL DEFAULT '' AFTER me_memo;
ALTER TABLE g5_memo ADD me_source varchar(255) NOT NULL DEFAULT '' AFTER me_file;
ALTER TABLE g5_memo ADD me_filesize int(11) NOT NULL DEFAULT '0' AFTER me_source;

그리고 memo_form.php 파일을 수정하여 파일 업로드 폼을 추가합니다:


<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 쪽지 보내기 권한 체크
if ($member['mb_level'] < $config['cf_memo_send_level'])
    alert_close('쪽지를 보낼 권한이 없습니다.');
// ...기존 코드 유지...
?>
<form name="fmemoform" action="<?php echo G5_BBS_URL; ?>/memo_form_update.php" onsubmit="return fmemoform_submit(this);" method="post" enctype="multipart/form-data">
<!-- 기존 폼 필드들... -->
<!-- 파일 업로드 필드 추가 -->
<div class="memo_file">
  <input type="file" name="me_file" id="me_file">
  <p class="memo_file_notice">* 최대 2MB까지 업로드 가능합니다.</p>
</div>
<!-- 기존 버튼들... -->
</form>

memo_form_update.php 파일도 수정하여 파일 업로드 처리 로직을 추가합니다:


<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 파일 업로드 처리
$memo_file = '';
$memo_source = '';
$memo_filesize = 0;
if (isset($_FILES['me_file']) && !empty($_FILES['me_file']['name'])) {
  // 업로드 디렉토리 생성
  $upload_dir = G5_DATA_PATH.'/memo/'.substr($member['mb_id'],0,2);
  if(!is_dir($upload_dir)) {
    ($upload_dir, G5_DIR_PERMISSION);
    @chmod($upload_dir, G5_DIR_PERMISSION);
  }
  $filename = $_FILES['me_file']['name'];
  $filesize = $_FILES['me_file']['size'];
  
  // 파일 용량 체크
  if ($filesize > 2097152) { // 2MB 제한
    alert('파일 용량이 2MB를 초과했습니다.');
  }
  // 실제 파일명 생성
  $filepath = $upload_dir.'/'.$filename;
  $dest_file = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.get_microtime().'_'.str_replace('%', '', urlencode($filename));
  // 파일 업로드
  if (move_uploaded_file($_FILES['me_file']['tmp_name'], $upload_dir.'/'.$dest_file)) {
    $memo_file = $dest_file;
    $memo_source = $filename; 
    $memo_filesize = $filesize;
  }
}
// 쪽지 DB 입력
$sql = " insert into {$g5['memo_table']}
            ( me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo, me_file, me_source, me_filesize )
          values 
            ( '{$recv_mb_id}', '{$member['mb_id']}', '".G5_TIME_YMDHIS."', '{$memo}', '{$memo_file}', '{$memo_source}', '{$memo_filesize}' ) ";
sql_query($sql);
// ... 이하 기존 코드 ...

마지막으로 memo_view.php에서 첨부 파일을 표시하고 다운로드할 수 있게 수정합니다:


<?php
// ... 기존 코드 ...
// 첨부파일이 있다면 표시
if ($memo['me_file']) {
  $filepath = G5_DATA_PATH.'/memo/'.substr($member['mb_id'],0,2).'/'.$memo['me_file'];
  if (file_exists($filepath)) {
    $download_url = G5_BBS_URL.'/memo_download.php?me_id='.$memo['me_id'].'&token='.get_token();
    echo '<div class="memo_file">';
    echo '<a href="'.$download_url.'">';
    echo '<i class="fa fa-download" aria-hidden="true"></i> '.$memo['me_source'];
    echo ' ('.get_filesize($memo['me_filesize']).')';
    echo '</a>';
    echo '</div>';
  }
}

memo_download.php 파일도 새로 생성하여 파일 다운로드를 처리합니다:


<?php
include_once('./_common.php');
if (!$is_member)
    alert('회원만 이용하실 수 있습니다.');
$me_id = isset($_GET['me_id']) ? (int) $_GET['me_id'] : 0;
$token = isset($_GET['token']) ? clean_xss_tags($_GET['token']) : '';
if(!verify_token('download', $token))
    alert('토큰 값이 올바르지 않습니다.');
$sql = " select * from {$g5['memo_table']} where me_id = '$me_id' ";
$memo = sql_fetch($sql);
if (!$memo['me_id'])
    alert('존재하지 않는 쪽지입니다.');
if(!($memo['me_recv_mb_id'] === $member['mb_id'] || $memo['me_send_mb_id'] === $member['mb_id']))
    alert('다운로드 권한이 없습니다.');
$filepath = G5_DATA_PATH.'/memo/'.substr($member['mb_id'],0,2).'/'.$memo['me_file'];
if (!is_file($filepath))
    alert('파일이 존재하지 않습니다.');
$filepath = addslashes($filepath);
if (!preg_match("/^[0-9A-Za-z\_\-]+\/.*]/", $filepath))
    alert('프로그램에 올바르지 않은 접근을 하셨습니다.');
$original = urlencode($memo['me_source']);
if(preg_match("/msie/i", $_SERVER['HTTP_USER_AGENT']) && preg_match("/5\.5/", $_SERVER['HTTP_USER_AGENT'])) {
    header("content-type: doesn/matter");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"$original\"");
    header("content-transfer-encoding: binary");
} else {
    header("content-type: file/unknown");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"$original\"");
    header("content-description: php generated data");
}
header("pragma: no-cache");
header("expires: 0");
flush();
$fp = fopen($filepath, 'rb');
$file_contents = fread($fp, filesize($filepath));
fclose($fp);
echo $file_contents;
답변을 작성하시기 전에 로그인 해주세요.
전체 126,916 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT