|
|
|
|
@ -36,75 +36,86 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ========== AI 모델 업로드 로직 시작 ==========
|
|
|
|
|
// ========== [수정됨] AI 모델 업로드 로직 시작 ==========
|
|
|
|
|
if (contentModels) {
|
|
|
|
|
const modelTable = contentModels.querySelector('.model-table');
|
|
|
|
|
|
|
|
|
|
if (modelTable) {
|
|
|
|
|
modelTable.addEventListener('click', (event) => {
|
|
|
|
|
// '시작'(업로드) 버튼이 클릭되었는지 확인
|
|
|
|
|
if (event.target.classList.contains('btn-action')) {
|
|
|
|
|
event.preventDefault(); // 기본 동작 방지
|
|
|
|
|
|
|
|
|
|
const startButton = event.target;
|
|
|
|
|
// 클릭된 버튼이 속한 테이블 행(tr)을 찾음
|
|
|
|
|
const row = startButton.closest('tr');
|
|
|
|
|
|
|
|
|
|
// 해당 행에서 파일 입력(input) 요소를 찾음
|
|
|
|
|
const fileInput = row.querySelector('.hidden-file-input');
|
|
|
|
|
// 해당 행의 모델 번호와 역할을 가져옴
|
|
|
|
|
const modelId = row.querySelector('td:first-child').textContent;
|
|
|
|
|
const modelRole = row.querySelector('td:nth-child(2)').textContent;
|
|
|
|
|
|
|
|
|
|
// 파일이 선택되었는지 확인
|
|
|
|
|
if (fileInput.files.length === 0) {
|
|
|
|
|
alert('먼저 .aiwbin 파일을 선택해주세요.');
|
|
|
|
|
return;
|
|
|
|
|
// 전역 업로드 관련 요소 가져오기
|
|
|
|
|
const globalFileInput = document.getElementById('global-file-input');
|
|
|
|
|
const fileNameDisplay = document.getElementById('file-name-display');
|
|
|
|
|
const globalUploadButton = document.getElementById('global-upload-button');
|
|
|
|
|
|
|
|
|
|
// '찾아보기'로 파일 선택 시
|
|
|
|
|
if (globalFileInput && fileNameDisplay) {
|
|
|
|
|
globalFileInput.addEventListener('change', () => {
|
|
|
|
|
if (globalFileInput.files.length > 0) {
|
|
|
|
|
const file = globalFileInput.files[0];
|
|
|
|
|
|
|
|
|
|
// 파일 확장자 확인
|
|
|
|
|
if (!file.name.endsWith('.aiwbin')) {
|
|
|
|
|
alert('잘못된 파일 형식입니다. .aiwbin 파일만 선택할 수 있습니다.');
|
|
|
|
|
globalFileInput.value = ''; // 파일 선택 초기화
|
|
|
|
|
fileNameDisplay.textContent = '선택된 파일 없음';
|
|
|
|
|
} else {
|
|
|
|
|
// 파일명 표시
|
|
|
|
|
fileNameDisplay.textContent = file.name;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
fileNameDisplay.textContent = '선택된 파일 없음';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const file = fileInput.files[0];
|
|
|
|
|
// '업로드' 버튼 클릭 시
|
|
|
|
|
if (globalUploadButton && globalFileInput) {
|
|
|
|
|
globalUploadButton.addEventListener('click', () => {
|
|
|
|
|
// 파일이 선택되었는지 확인
|
|
|
|
|
if (globalFileInput.files.length === 0) {
|
|
|
|
|
alert('먼저 .aiwbin 파일을 선택해주세요.');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 파일 확장자 확인 (클라이언트 측)
|
|
|
|
|
if (!file.name.endsWith('.aiwbin')) {
|
|
|
|
|
alert('잘못된 파일 형식입니다. .aiwbin 파일만 업로드할 수 있습니다.');
|
|
|
|
|
fileInput.value = ''; // 파일 선택 초기화
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const file = globalFileInput.files[0];
|
|
|
|
|
|
|
|
|
|
// FormData 객체 생성
|
|
|
|
|
const formData = new FormData();
|
|
|
|
|
formData.append('modelFile', file); // 'modelFile'은 server.js와 일치해야 함
|
|
|
|
|
formData.append('modelId', modelId);
|
|
|
|
|
formData.append('modelRole', modelRole);
|
|
|
|
|
|
|
|
|
|
// 업로드 중 버튼 비활성화
|
|
|
|
|
startButton.disabled = true;
|
|
|
|
|
startButton.textContent = '업로드 중...';
|
|
|
|
|
|
|
|
|
|
// Fetch API를 사용하여 파일 업로드
|
|
|
|
|
fetch('/upload-model', {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: formData
|
|
|
|
|
})
|
|
|
|
|
.then(response => response.json())
|
|
|
|
|
.then(data => {
|
|
|
|
|
if (data.status === 'success') {
|
|
|
|
|
alert(`업로드 성공!\n모델: ${modelRole}\n파일: ${file.name}`);
|
|
|
|
|
fileInput.value = ''; // 파일 선택 초기화
|
|
|
|
|
} else {
|
|
|
|
|
alert(`업로드 실패: ${data.message}`);
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Upload error:', error);
|
|
|
|
|
alert('업로드 중 오류가 발생했습니다.');
|
|
|
|
|
})
|
|
|
|
|
.finally(() => {
|
|
|
|
|
// 버튼 다시 활성화
|
|
|
|
|
startButton.disabled = false;
|
|
|
|
|
startButton.textContent = '시작';
|
|
|
|
|
});
|
|
|
|
|
// (이중 확인) 파일 확장자 확인
|
|
|
|
|
if (!file.name.endsWith('.aiwbin')) {
|
|
|
|
|
alert('잘못된 파일 형식입니다. .aiwbin 파일만 업로드할 수 있습니다.');
|
|
|
|
|
globalFileInput.value = '';
|
|
|
|
|
fileNameDisplay.textContent = '선택된 파일 없음';
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// FormData 객체 생성
|
|
|
|
|
const formData = new FormData();
|
|
|
|
|
formData.append('modelFile', file); // 'modelFile'은 server.js와 일치해야 함
|
|
|
|
|
// [제거됨] modelId, modelRole 전송 로직
|
|
|
|
|
|
|
|
|
|
// 업로드 중 버튼 비활성화
|
|
|
|
|
globalUploadButton.disabled = true;
|
|
|
|
|
globalUploadButton.textContent = '업로드 중...';
|
|
|
|
|
|
|
|
|
|
// Fetch API를 사용하여 파일 업로드
|
|
|
|
|
fetch('/upload-model', {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: formData
|
|
|
|
|
})
|
|
|
|
|
.then(response => response.json())
|
|
|
|
|
.then(data => {
|
|
|
|
|
if (data.status === 'success') {
|
|
|
|
|
alert(`업로드 성공!\n파일: ${file.name}`);
|
|
|
|
|
globalFileInput.value = ''; // 파일 선택 초기화
|
|
|
|
|
fileNameDisplay.textContent = '선택된 파일 없음';
|
|
|
|
|
} else {
|
|
|
|
|
alert(`업로드 실패: ${data.message}`);
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch(error => {
|
|
|
|
|
console.error('Upload error:', error);
|
|
|
|
|
alert('업로드 중 오류가 발생했습니다.');
|
|
|
|
|
})
|
|
|
|
|
.finally(() => {
|
|
|
|
|
// 버튼 다시 활성화
|
|
|
|
|
globalUploadButton.disabled = false;
|
|
|
|
|
globalUploadButton.textContent = '업로드';
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -318,3 +329,4 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
|
|
|
// ========== video-test.html 스크립트 추가 끝 ==========
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
//<!--2025.11.12 15:56-->
|