import React, {useState} from 'react';
export default function FileUploadPage(){
const [selectedFile, setSelectedFile] = useState();
const [isFilePicked, setIsFilePicked] = useState(false);
const changeHandler = (event) => {
setSelectedFile(event.target.files[0]);
setIsFilePicked(true);
};
const handleSubmission = () => {
var data = new FormData()
data.append('file', selectedFile)
fetch('http://localhost:3003/file/fileUpload', {
method: 'POST',
body: data
})
};
return(
<div>
<input type="file" name="file" onChange={changeHandler} />
{isFilePicked ? (
<div>
<p>Filename: {selectedFile.name}</p>
<p>Filetype: {selectedFile.type}</p>
<p>Size in bytes: {selectedFile.size}</p>
</div>
) : (
<p>Select a file to show details</p>
)}
<div>
<button onClick={handleSubmission}>Submit</button>
</div>
</div>
)
}
npm install @nestjs/platform-express --save
npm install @types/express -D
npx @nestjs/cli g module file
npx @nestjs/cli g controller file --no-spec
npx @nestjs/cli g service file --no-spec
대충 이런식의 구조다.
import { Module } from '@nestjs/common';
import { FileController } from './file.controller';
import { FileService } from './file.service';
import { MulterModule } from '@nestjs/platform-express';
@Module({
imports: [MulterModule.register({
dest: './files',
})],
controllers: [FileController],
providers: [FileService]
})
export class FileModule {}
import { Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { FileService } from './file.service';
@Controller('file')
export class FileController {
constructor( private fileService:FileService ){}
@Post("/fileUpload")
@UseInterceptors(
FileInterceptor('file'),
)
async fileUpload(@UploadedFile() file: Express.Multer.File){
console.log(file)
}
}
하다보니 서비스는 생략하겠다...
루트 경로 밑에 files 라는 폴더가 생성되면서 파일이 저장된다. 뭔가 그냥 막 생성된 느낌이다. 실제로 열어보면 업로드한 파일이 맞더라.
https://gabrieltanner.org/blog/nestjs-file-uploading-using-multer