return <div>
<h1>이미지 업로드</h1>
<input type="file" onChange={handleChangeImage} />
<hr />
<ul>
{imgURLs.map((imgURL) => (
<img src={imgURL} key={imgURL} />
))}
</ul>
</div>
위와 같이 Input 태그를 활용해 사진파일을 입력받고, imgURLs라는 state로 백엔드에 저장된 사진들을 보여주는 JSX 코드를 짜주었다.
const handleChangeImage: ComponentProps<"input">["onChange"] = async (
e
) => {
const files = e.target.files;
if (!files) return;
console.log("image-files: ", files);
...
};
위와 같이 onChange 이벤트핸들러로 오는 event 변수에 .target.files로 사용자가 입력한 사진 파일들이 저장되어 있다.
이 파일을 formData로 감싸서 fetch post로 백엔드로 전송한다
const handleChangeImage: ComponentProps<"input">["onChange"] = async (
e
) => {
const files = e.target.files;
if (!files) return;
const formData = new FormData();
formData.append("img", files[0]);
const response = await fetch("http://localhost:3000/api/images", {
method: "post",
body: formData,
});
const imgURL = await response.json();
setImgURLs((prevURLs) => [...prevURLs, imgURL]);
};
백엔드로 전송된 사진 파일을 보기 위해 NextRequest에 formData 메서드로 데이터를 변수로 받아온 후 파일에 저장하는 코드를 작성했다.
export async function POST(req: NextRequest) {
const formData = await req.formData();
const file = formData.get("img") as File;
const rootPath = process.cwd();
const dirPath = "public/img";
const fileName = file.name;
const filePath = path.join(rootPath, dirPath, fileName);
const arrBuffer = await file.arrayBuffer();
const data = Buffer.from(arrBuffer);
await writeFile(filePath, data);
const imgURL = `http://localhost:3000/img/${fileName}`;
return NextResponse.json(imgURL);
}
dirPath에 설정한 pulbic/img 폴더에 정상적으로 사진이 저장되는 것을 볼 수 있었다.
그런데 파일 디렉토리를 찾고, 사진을 저장하는 부분이 다른 코드와 중복되는 부분이 있어 함수로 작성해주었다.
function getPath(path, fileName) {
const rootPath = process.cwd();
const fileName = file.name;
const filePath = path.join(rootPath, path, fileName);
const arrBuffer = await file.arrayBuffer();
const data = Buffer.from(arrBuffer);
await writeFile(filePath, data);
}
'Today I Learned > Task' 카테고리의 다른 글
[Task] Supabase로 로그인/회원가입 구현 (1) | 2024.09.27 |
---|---|
[Task] Next.js에서 백엔드 구현 (1) | 2024.09.27 |
[Task] Express와 Firestore 연동하기 (3) | 2024.09.20 |
[Task] Express & React 연동하기 (0) | 2024.09.20 |
[Task] 최소화 상태의 검색바에서 가상선택자 스타일 없애기 (0) | 2024.09.03 |