Pada nodejs jika kita browse tentang upload file maka kebanyakan akan menggunakan multer. Walaupun saya pernah membuat artikel upload selain menggunakan multer yaitu dengan menggunakan fileupload.
Kali ini saya akan menulis tentang pengalaman saya menggunakan multer dengan framework nodejs express.
Pertama buat folder dengan nama balajar multer. Lalu buka dengan visualcode.
Buka terminal lalu ketikkan perintah
npm i express, multer
Buat file bernama index.js. Ketikkan perintah berikut. Agar lebih mudah memahami saya buat comment pada bagian-bagian yang penting.
'use strict'
// persiapan express, app, http dan server
const express = require('express')
const app = express()
const http = require('http')
const server = http.createServer(app)
// definisikan variabel multer
const multer = require('multer')
// definisikan storage untuk penyimpanan file
const storage = multer.diskStorage({
// lokasi penyimpanan file
destination: function (req, file, cb) {
cb(null, 'public/images')
},
// membuat nama file unik agar tidak bertabrakan dengan file lainnya saat diakses dan memberi ekstensi sesuai mimetype
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
if ( file.mimetype == 'image/jpeg') {
var mimetype = '.jpg'
} else if ( file.mimetype == 'image/png') {
var mimetype = '.png'
} else if ( file.mimetype == 'image/gif') {
var mimetype = '.gif'
} else {
// Add mimetype here
console.log('\n\n> add your mimetype here. Please read https://ndalu.id/blog/mimetpe-list')
var mimetype = '.document'
}
cb(null, uniqueSuffix + mimetype)
}
})
// definisikan upload untuk single file
const upload = multer({ storage: storage }).single('file')
// gunakan folder public sebagai static
app.use(express.static('public'))
// route halaman / untuk contoh view upload file
app.get('/', (req, res) => {
const path = require('path') // load path
res.sendFile(path.join(__dirname, './public/index.html')) // kirim file index.html di folder public untuk view
})
// route untuk post dari halaman index.html
app.post('/', upload, (req, res) => {
const file = req.file
console.log(file)
res.send({message: 'Your file was uploaded', file: file, path: 'http://localhost:3000/images/'+file.filename})
})
server.listen(3000, console.log('\n> Server run and listening port 3000'))
Lalu buat folder public dan buat didalamnya 1 buah folder images dan 1 buah file bernama index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- ELEMENT FORM START -->
<form id="form">
<input type="file" name="file" /><br />
<input type="submit" value="submit" />
</form>
<!-- ELEMENT FORM END -->
<!-- ELEMENT PRE UNTUK MENAMPILKAN JSON hasil dari post -->
<pre id="pre" style="background-color: black; color: azure; padding: 10px 10px 10px 10px ;"></pre>
<!-- ELEMENT A berisi gambar hasil post, klik untuk mengakses url hasil upload -->
<a href="#" id="link" target="_blank">
<!-- PREVIEW tampilan hasil upload -->
<img src="" alt="" id="img" style="display: none; max-width: 100px;">
</a>
<script>
const form = document.querySelector('#form') // element upload
// listen element saat menerima submit
form.addEventListener('submit', async(e) => {
e.preventDefault() // prevent post karena menggunakan metode ajax agar tanpa reload halaman bisa melakukan aksi
const formData = new FormData(form) // buat FormData dari element form
if ( formData.get('file').size > 10000000 ) return alert('Max size is 10Mb') // limit maksimal upload 10MB
if ( formData.get('file').size == 0 ) return alert('No file uploaded') // cegah post jika tidak ada file yang diupload
const req = await fetch('/', {method: 'POST', body: formData}) // request berupa post. Lebih detail lihat index.js line 42
const res = await req.json() // result berupa json. Lebih detail lihat index.js line 47
// Manipulasi DOM berdasarkan res
document.querySelector('#pre').innerHTML = JSON.stringify(res, undefined, 2)
document.querySelector('#link').href = res.path
document.querySelector('#img').src = res.path
document.querySelector('#img').alt = res.file.originalname
document.querySelector('#img').style = 'display: block; max-width: 200px'
})
</script>
</body>
</html>
Jalankan aplikasi dengan mengetik pada terminal node index.js. Lalu buka http://localhost:3000
Jika merasa kebingunan bisa anda download source code pada github saya
Terima kasih
Penulis adalah seorang penghobi ngulik komputer. Diawali dengan meledakkan beberapa PC pentium 1 untuk mengobati rasa penasarannya sampai akhirnya sekarang mempelajari bahasa pemrograman.
Berawal dari bahasa html dan css untuk membuat static page. Lalu mulai mengenal PHP untuk backend dan sekarang lebih menyukai NODEJS dan pembuatan aplikasi android ataupun ios
Tanya-tanya, hire pekerjaan, sekedar hay-hay'an silahkan contact di halaman Contact atau kunjungi channel saya