테스트 사이트 - 개발 중인 베타 버전입니다

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

ㅐ늑대ㅐ 11개월 전 조회 1,638

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

정작에 찾자니까 없네요 

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

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

채택된 답변
+20 포인트
11개월 전

없을 수도 있습니다.

그나마 찾은 건,
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'].'&amp;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;

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인