A. Upload Satu File
Pada aplikasi kita membutuhkan fitur upload file seperti gambar, dokumen, dan lain-lain. Kita akan tambahkan fitur ini pada project ini. NestJs sendiri sudah menyediakan module untuk fitur ini dengan package multer. Dengan menggunakan Multer, kita dapat mengunggah file dari klien (client) ke server dengan lebih efisien.
Note
Gunakan multipart/form-data
pada body request pada saat mengirimkan file.
Jika menggunakan Postman pilih body
kemudian form-data
.
Selanjutkan kita mulai membuat kode untuk menambahkan fitur ini.
1. Instalasi Type Multer
Karena kita menggukana TypeScript, kita instalasi dahulu type/multer
2.Buat controller fitur upload
Pada fitur ini, kita hanya akan membaut controller tanpa module dan service
3. Buat endpoint upload file
upload.controller.ts
import {
Controller,
Delete,
HttpException,
HttpStatus,
Param,
Post,
UploadedFile,
UploadedFiles,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { ResponseSuccess } from 'src/interface/response';
import BaseResponse from 'src/utils/response/base.response';
import { JwtGuard } from '../auth/auth.guard';
@UseGuards(JwtGuard)
@Controller('upload')
export class UploadController extends BaseResponse {
constructor() {
super();
}
@UseInterceptors(
FileInterceptor('file', {
storage: diskStorage({
destination: 'public/uploads',
filename: (req, file, cb) => {
const fileExtension = file.originalname.split('.').pop();
cb(null, `${new Date().getTime()}.${fileExtension}`);
},
}),
}),
)
@Post('file')
async uploadFile(
@UploadedFile() file: Express.Multer.File,
): Promise<ResponseSuccess> {
try {
const url = `${process.env.BASE_SERVER_URL}/uploads/${file.filename}`;
return this._success('OK', {
file_url: url,
file_name: file.filename,
file_size: file.size,
});
} catch (err) {
throw new HttpException('Ada Kesalahan', HttpStatus.BAD_REQUEST);
}
}
}
- Decorator
@UseInterceptors
akan menerapkanFileInterceptor(...)
dengan paramterfile
maka dariPostman
nama dari field yang dikirim padaform-data
adalah `file``.
Note
decorator FileInterceptor
menerima dua argument, yaitu:
fieldName
: nama field sesuai dengan yang dikirim dari client baik melalui Postman atau form HTML.optional
: objek-objek opsional yang disediakan oleh Multer melalui MulterOptions, seperti misalnya penamaan file, direktory dan lainnya.
- Folder
public/uploads
adalah folder tempat disimpan file yang di upload. - Pada bagian
filename
, kita memberikan nama baru untuk file yang di upload dengna nama waktu ketika di upload ditambah extensi dari file yang di upload , contoh nama yang akan dibuat seperti1690640378860.pdf
- Response yang diberikan pada client yaitu
url
= lokasi untuk mengakses file dari clientfile_name
= nama file yang dibuatsize
= ukuran dari file yang di upload