728x90
반응형
Next.js와 HeidiSQL을 사용하여 파일 첨부 및 데이터베이스 저장하는 방법
파일 저장 접근 방법
파일을 데이터베이스에 저장하는 방법은 주로 두 가지가 있습니다
1. BLOB 데이터 타입 사용
2. 파일 경로 저장 및 실제 파일은 서버에 저장
BLOB 데이터 타입을 사용한 직접 저장 방법
1. 데이터베이스 테이블 구조 설정
CREATE TABLE uploaded_files (
id INT AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255),
file_data LONGBLOB,
file_type VARCHAR(100),
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. Next.js API 라우트 구현
import { NextApiRequest, NextApiResponse } from 'next';
import mysql from 'mysql2/promise';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === 'POST') {
try {
// 데이터베이스 연결 설정
const connection = await mysql.createConnection({
host: 'localhost',
user: 'your_username',
password: 'your_password',
database: 'your_database'
});
// 파일 데이터 추출 (multipart/form-data 사용 가정)
const { originalFilename, mimetype, buffer } = req.body;
// 파일을 데이터베이스에 저장하는 쿼리
const [result] = await connection.execute(
'INSERT INTO uploaded_files (filename, file_data, file_type) VALUES (?, ?, ?)',
[originalFilename, buffer, mimetype]
);
await connection.end();
res.status(200).json({ message: '파일 업로드 성공', fileId: result.insertId });
} catch (error) {
res.status(500).json({ message: '파일 업로드 실패', error: error.message });
}
} else {
res.status(405).json({ message: '허용되지 않은 메서드' });
}
}
주의사항
1. 파일 크기 제한: BLOB 타입은 큰 파일을 저장할 수 있지만, 성능과 데이터베이스 용량에 영향을 줄 수 있습니다.
2.보안
- 파일 업로드 시 파일 유형, 크기 제한
- 악성 파일 검사
- 인증/권한 확인
3. 대안적 접근
- 파일은 서버나 클라우드 스토리지에 저장
- 데이터베이스에는 파일 경로만 저장
파일 업로드 프론트엔드 예시
import { useState } from 'react';
import axios from 'axios';
export default function FileUpload() {
const [selectedFile, setSelectedFile] = useState<File | null>(null);
const handleFileUpload = async () => {
if (!selectedFile) return;
const formData = new FormData();
formData.append('file', selectedFile);
try {
const response = await axios.post('/api/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
console.log('파일 업로드 성공:', response.data);
} catch (error) {
console.error('파일 업로드 실패:', error);
}
};
return (
<div>
<input
type="file"
onChange={(e) => setSelectedFile(e.target.files?.[0] || null)}
/>
<button onClick={handleFileUpload}>업로드</button>
</div>
);
}
추천 패키지
- 파일 업로드: `multer`, `formidable`
- 데이터베이스 연결: `mysql2`
이 방법은 파일을 직접 MySQL 데이터베이스에 BLOB 형태로 저장하는 방법입니다. 대용량 파일이나 많은 파일을 다룰 경우 파일 시스템이나 클라우드 스토리지를 고려하는 것이 좋습니다.
728x90
반응형
'코딩공부 > Next.js' 카테고리의 다른 글
Next.js의 오류처리 (4) | 2024.10.31 |
---|---|
Next.js의 Layout과 Template (1) | 2024.10.31 |