1. JavaScript 파일 입력 필드 name 수정
- 변경 전: attachments_${fileUploadCount}[] (각 필드마다 다른 이름)
- 변경 후: attachments[] (모든 필드가 동일한 이름으로 배열로 전송)
2. 서버 측 파일 업로드 처리 개선
- attachments[] 배열 처리
- attachments_* 패턴도 처리 (하위 호환성)
- 디버깅 로그 추가
작동 방식
- 파일 추가 버튼 클릭 → attachments[] name을 가진 파일 입력 필드 추가
- 여러 파일 선택 가능 (각 입력 필드에서 multiple 속성 사용)
- 폼 제출 시 모든 파일이 attachments[] 배열로 전송
- 서버에서 $_FILES['attachments']로 받아 처리
테스트 방법
- 글쓰기/수정 페이지에서 "파일 추가" 버튼 클릭
- 파일 선택 (여러 파일 선택 가능)
- 저장 후 파일이 업로드되는지 확인
- 브라우저 개발자 도구 → Network 탭에서 POST 요청 확인
- 서버 에러 로그에서 "파일 업로드 시작" 메시지 확인
아.. 전에 됐던거 같네요.. 파일명이 js, php 이런 파일들 첨부가 안되는 문제..
지금은 doc파일들 한 개 첨부하고 수정 들어가면 파일첨부 아래 위로 두개 표시되고, 삭제 누르면 삭제되었다고 뜨는데, 다시 수정들어가면 삭제 안된채 그대로 보여요.
- js, php 등 확장자 첨부 불가
- 파일 삭제가 실제로 반영되지 않음
- 허용 확장자에 js, php 등 추가
- 파일 삭제 로직 수정: 삭제할 파일 ID를 hidden input으로 전송
+16-1
$this->allowedExtensions = [
// 이미지
'jpg', 'jpeg', 'png', 'gif', 'webp', 'svg',
// 문서
'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'hwp', 'txt', 'rtf',
// 압축
unified-write.js
+35-1
}
// existing_files[] hidden input 제거
const existingFileInput = fileItem.querySelector('input[name="existing_files[]"]');
if (existingFileInput) {
existingFileInput.remove();
}
+2-28
});
}
}
}
// 기존 파일들 로드
if (existingPost.files && existingPost.files.length > 0) {
const fileUploadList = document.getElementById("file-upload-list");
if (fileUploadList) {
existingPost.files.forEach(file => {
const fileItem = document.createElement("div");
fileItem.className = "existing-file-item";
fileItem.setAttribute("data-file-id", file.id);
fileItem.innerHTML = `
<div class="file-info">
<i class="fas fa-file"></i>
<span class="file-name">${file.original_name}</span>
<span class="file-size">(${file.file_size.toLocaleString()} bytes)</span>
</div>
<div class="file-actions">
<a href="${file.file_path}" target="_blank" class="btn btn-sm btn-info">
<i class="fas fa-download"></i> 다운로드
</a>
<button type="button" class="btn btn-sm btn-danger" onclick="deleteExistingFile(${file.id})">
<i class="fas fa-trash"></i> 삭제
</button>
</div>
<input type="hidden" name="existing_files[]" value="${file.id}">
`;
fileUploadList.appendChild(fileItem);
});
}
}
// 기존 파일들은 템플릿에서 이미 표시되므로 JavaScript에서 추가하지 않음
// (중복 표시 방지)
}
+21-7
// MIME 타입 검증
$allowedMimes = [
'image/jpeg', 'image/png', 'image/gif', 'image/webp',
// MIME 타입 검증
'image/jpeg', 'image/png', 'image/gif', 'image/webp',
// MIME 타입 검증 (확장자 검증이 더 엄격하므로 MIME 타입은 선택적 검증)
$allowedMimes = [
// 이미지
수정 사항
1. 허용 확장자 추가
- js, php, html, css, json, xml, sql, py, java, cpp, c, h 등 코드/스크립트 파일 추가
- svg, csv, tsv, rar, 7z, tar, gz, mp4, avi, mov, wmv, ogg, m4a 등 추가
2. 파일 삭제 기능 수정
- 삭제 버튼 클릭 시:
- existing_files[] hidden input 제거
- delete_files[] hidden input 추가
- 시각적으로 삭제 예정 표시 (회색 처리, 취소선)
- 삭제 버튼 비활성화 및 "삭제 예정" 텍스트 표시
3. 파일 중복 표시 문제 해결
- loadExistingData()에서 기존 파일 추가 로직 제거
- 템플릿에서 이미 표시하므로 JavaScript에서 중복 추가하지 않음
4. MIME 타입 검증 완화
- 확장자 검증을 우선
- MIME 타입이 허용 목록에 없어도 확장자가 허용되면 경고만 하고 허용
- 브라우저/서버에서 MIME 타입을 잘못 감지하는 경우 대응
작동 방식
- 파일 삭제:
- 삭제 버튼 클릭 → 확인 대화상자 표시
- 확인 시 → 파일 항목에 "삭제 예정" 표시 및 delete_files[] hidden input 추가
- 저장 시 → 서버에서 delete_files[] 배열의 파일 ID를 받아 실제 삭제 처리
- 파일 업로드:
- js, php 등 코드 파일도 업로드 가능
- 확장자 검증을 통과하면 MIME 타입이 없어도 허용

댓글 0개