전체 요약 — 첨부 미디어 처리 개선 보고서
https://www.11q.kr/bbs/board.php?bo_table=cording2&wr_id=17
제목: 그누보드_스킨보드)BS4-Basic-Webzine_11q _mp3_mp4_pdf_youtube_php82.7z
✅ 개요
PHP 7.0 환경에서 작성된 G5 기반 게시판 첨부 미디어 처리 코드가
PHP 8.2 환경에서 다음과 같은 문제를 일으켰음:
-
PHP 8.x에서 count(), isset(), pathinfo() 사용 방식 차이
-
배열 존재 여부 / 타입 체크 누락
-
일부 환경에서 브라우저 보안 정책(CORS, MIME) 또는 모바일 PDF 렌더링 실패
-
자동 실행 및 토글 버튼의 JS 비동기 처리 문제
-
Deprecated: Optional parameter ... 관련 구문 경고
이를 개선하여 유튜브, 일반 동영상, 오디오, PDF 첨부 파일을 자동 인식/표시 + 토글 버튼 제어 구조로 통합 및 안정화함.
1️⃣ 유튜브 첨부 미디어 개선
문제점
개선 내용
-
isset($view['link']) && is_array($view['link']) 안전 체크 추가
-
iframe에 allowfullscreen, referrerpolicy="no-referrer" 옵션 추가
-
클릭 시 열림/닫힘 구조(유튜브 보기 / 닫기) 추가
-
모바일 반응형 width:100%; aspect-ratio:16/9; 적용
✅ 결과
→ PHP 8.2 호환, 모든 브라우저/모바일 반응형 자동 맞춤
→ 사용자 클릭 기반으로 안전한 재생
2️⃣ 일반 동영상 첨부 개선 (mp4, webm 등)
문제점
개선 내용
-
pathinfo($file['source'], PATHINFO_EXTENSION) 전 안전체크 추가
-
동영상 확장자 자동 필터링 (mp4, mov, avi, webm)
-
video 태그: controls preload="metadata"로 변경
-
“동영상 닫기 / 보기” 토글 버튼 추가
✅ 결과
→ PHP 8.2 호환, 모바일(iOS/Android) 재생 가능
→ 여러 첨부 시 자동 인덱스 부여로 충돌 방지
3️⃣ MP3 오디오 첨부 개선
문제점
개선 내용
-
$mp3Index로 고유 btnId, containerId 생성
-
“MP3 닫기 / 듣기 (파일명)” 토글 버튼 구조
-
audio controls preload="none" 적용 (페이지 로드시 자동 로딩 방지)
-
다운로드 링크 추가
-
PHP 8.2 안전체크 (isset, is_array) 추가
✅ 결과
→ 다중 오디오 첨부도 독립 제어
→ PHP 8.2 완전 호환
→ 모바일/데스크탑 자동 인식
4️⃣ PDF 첨부 보기 개선
문제점
개선 내용
-
$pdfIndex로 개별 컨테이너 구분
-
file_exists() 체크 후 base64 인코딩
-
모바일: pdf.js base64 기반 canvas 렌더링
-
PC: PDFObject.embed() 통한 빠른 표시
-
“PDF 닫기 / 바로보기 (파일명)” 토글 버튼 구현
-
try-catch 오류 메시지 처리
✅ 결과
→ 모바일/PC 완전 자동 대응
→ PHP 8.2 호환 및 중복 로딩 없음
→ PDF.js 최신 버전(2.10.377) 사용으로 안정성 확보
⚙️ 공통 개선 사항
| 구분 |
개선 전 문제 |
개선 후 변경 내용 |
| PHP 버전 호환성 |
PHP 7 문법 의존 (isset, pathinfo, count) |
isset() + is_array() + strtolower() 안정 처리 |
| 다중 첨부 |
동일한 ID 중복 |
$index 기반 고유 ID 생성 |
| UI 동작 |
자동 실행으로 불필요한 트래픽 |
클릭 시 토글 구조로 변경 |
| JS 구조 |
전역 변수 충돌 가능 |
즉시실행함수 (function(){ ... })() 로 스코프 분리 |
| 사용자 경험 |
무조건 펼침 / 느린 로딩 |
초기 “펼침 상태” 유지, 클릭 시 닫기 기능 추가 |
| 접근성 |
버튼명 불명확 |
“MP3 닫기(파일명)” / “PDF 바로보기(파일명)” 명확 표시 |
PHP 8.2 호환 포인트 요약
| 변경 사항 |
대응 방법 |
pathinfo() undefined index 발생 |
isset($file['source']) 체크 |
file_get_contents() 경로 에러 |
file_exists() 조건 추가 |
count(null) 경고 |
is_array() 조건으로 감싸기 |
Deprecated: Optional parameter |
불필요한 기본값 파라미터 제거 |
| HTML 출력 시 Warning |
echo htmlspecialchars() 또는 안전한 echo 구조 적용 |
결론
✅ 결과:
모든 첨부 미디어(Youtube, MP4, MP3, PDF)가
???? 적용 시점:
각 첨부 모듈은 독립적으로 유지보수 가능하며,
view.skin.php 또는 view.file.php 내에 통합 구성 시
향후 PHP 8.3/9.0에서도 문제 없이 확장 가능 구조.
원하신다면 이 4개 모듈(유튜브, 동영상, MP3, PDF)을 하나의
통합 미디어 렌더러 PHP 모듈 (예: view_media_block.php) 형태로
자동 인식 구조로 묶어드릴 수도 있습니다.
그렇게 정리해드릴까요?