전에 쪽지에 첨부파일보내기 하는 스킨혹은 팁 같은거 본적이있는데
본문
전에 쪽지에 첨부파일보내기 하는 스킨혹은 팁 같은거 본적이있는데
정작에 찾자니까 없네요
혹시 아시는분 답변 부탁 합니다.
답변 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)) {
@mkdir($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;
답변을 작성하시기 전에 로그인 해주세요.