답변 1개
채택된 답변
+20 포인트
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; // 개별 페이지 접근 불가</p>
<p>// 쪽지 보내기 권한 체크
if ($member['mb_level'] < $config['cf_memo_send_level'])
alert_close('쪽지를 보낼 권한이 없습니다.');</p>
<p>// ...기존 코드 유지...
?></p>
<p><form name="fmemoform" action="<?php echo G5_BBS_URL; ?>/memo_form_update.php" onsubmit="return fmemoform_submit(this);" method="post" enctype="multipart/form-data">
<!-- 기존 폼 필드들... --></p>
<p><!-- 파일 업로드 필드 추가 -->
<div class="memo_file">
<input type="file" name="me_file" id="me_file">
<p class="memo_file_notice">* 최대 2MB까지 업로드 가능합니다.</p>
</div></p>
<p><!-- 기존 버튼들... -->
</form>
memo_form_update.php 파일도 수정하여 파일 업로드 처리 로직을 추가합니다:
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가</p>
<p>// 파일 업로드 처리
$memo_file = '';
$memo_source = '';
$memo_filesize = 0;</p>
<p>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);
}</p>
<p> $filename = $_FILES['me_file']['name'];
$filesize = $_FILES['me_file']['size'];
// 파일 용량 체크
if ($filesize > 2097152) { // 2MB 제한
alert('파일 용량이 2MB를 초과했습니다.');
}</p>
<p> // 실제 파일명 생성
$filepath = $upload_dir.'/'.$filename;
$dest_file = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.get_microtime().'_'.str_replace('%', '', urlencode($filename));</p>
<p> // 파일 업로드
if (move_uploaded_file($_FILES['me_file']['tmp_name'], $upload_dir.'/'.$dest_file)) {
$memo_file = $dest_file;
$memo_source = $filename;
$memo_filesize = $filesize;
}
}</p>
<p>// 쪽지 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);</p>
<p>// ... 이하 기존 코드 ...
마지막으로 memo_view.php에서 첨부 파일을 표시하고 다운로드할 수 있게 수정합니다:
<?php
// ... 기존 코드 ...</p>
<p>// 첨부파일이 있다면 표시
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');</p>
<p>if (!$is_member)
alert('회원만 이용하실 수 있습니다.');</p>
<p>$me_id = isset($_GET['me_id']) ? (int) $_GET['me_id'] : 0;
$token = isset($_GET['token']) ? clean_xss_tags($_GET['token']) : '';</p>
<p>if(!verify_token('download', $token))
alert('토큰 값이 올바르지 않습니다.');</p>
<p>$sql = " select * from {$g5['memo_table']} where me_id = '$me_id' ";
$memo = sql_fetch($sql);</p>
<p>if (!$memo['me_id'])
alert('존재하지 않는 쪽지입니다.');</p>
<p>if(!($memo['me_recv_mb_id'] === $member['mb_id'] || $memo['me_send_mb_id'] === $member['mb_id']))
alert('다운로드 권한이 없습니다.');</p>
<p>$filepath = G5_DATA_PATH.'/memo/'.substr($member['mb_id'],0,2).'/'.$memo['me_file'];</p>
<p>if (!is_file($filepath))
alert('파일이 존재하지 않습니다.');</p>
<p>$filepath = addslashes($filepath);
if (!preg_match("/^[0-9A-Za-z\_\-]+\/.*]/", $filepath))
alert('프로그램에 올바르지 않은 접근을 하셨습니다.');</p>
<p>$original = urlencode($memo['me_source']);</p>
<p>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();</p>
<p>$fp = fopen($filepath, 'rb');
$file_contents = fread($fp, filesize($filepath));
fclose($fp);
echo $file_contents;
로그인 후 평가할 수 있습니다
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인전체 질문 목록
답변대기
답변대기
답변대기
답변대기
답변대기
답변대기
답변대기
답변대기
채택
답변대기
답변대기
답변대기
답변대기
채택
채택
답변대기
답변대기
답변대기
채택