Multer-bilder: opplasting av fjellbilder i Node.js
Denne appen viser hvordan du kan:
- hente ut fjell fra en database,
- vise bilder som hører til et valgt fjell,
- laste opp ett nytt bilde om gangen via nettsiden.
Hva du lærer
- hvordan et HTML-skjema sender bildefiler med multipart/form-data,
- hvordan multer tar imot og lagrer bildefiler,
- hvordan vi lagrer metadata i SQLite (filsti, navn, alt-tekst, fjell-id),
- hvordan frontend og backend samarbeider gjennom API-ruter.
Teknologi i prosjektet
- Express: webserver og API.
- Multer: håndterer filopplasting.
- better-sqlite3: lokal SQLite-database.
- Vanlig HTML/CSS/JS i public-mappen.
Mappestruktur (forenklet)
multer-bilder/
app.js
package.json
fjellbilder.db (opprettes automatisk ved kjøring)
public/
index.html
index.js
index.css
uploads/ (her lagres opplastede filer)
Kom i gang
1) Installer avhengigheter
Kjør i prosjektmappen:
2) Start serveren
Hvis alt er ok, får du en melding i terminalen om at serveren kjører på port 3000.
3) Åpne appen i nettleseren
Gå til:
Slik fungerer flyten i appen
Steg A: Serveren starter
Når appen starter i app.js skjer dette:
- databasen åpnes (fjellbilder.db),
- tabellene fjell og bilde opprettes hvis de ikke finnes,
- eksempeldata legges inn hvis fjell-tabellen er tom,
- Express serverer alt i public som statiske filer,
- multer settes opp til å lagre filer i public/uploads.
Steg B: Frontend henter fjell
I index.js kjøres en fetch mot GET /fjell.
Resultatet brukes til å fylle dropdown-lista i index.html.
Steg C: Bruker velger fjell
Når eleven velger et fjell i dropdown:
- frontend kaller GET /fjell/:id/bilder,
- backend henter alle bilder med riktig fjellid fra tabellen bilde,
- frontend viser bildene i siden.
Steg D: Bruker laster opp bilde
Når skjema sendes inn:
- frontend lager FormData fra skjemaet,
- valgt fjell-id hentes fra dropdown,
- frontend sender POST /fjell/:id/bilder,
- multer lagrer selve bildefilen i public/uploads,
- backend lagrer metadata i databasen (sti, navn, alternativtekst, fjellid),
- frontend henter bildelista på nytt og viser oppdatert innhold.
API-ruter i prosjektet
GET /fjell
Returnerer alle fjell.
Eksempelrespons:
[
{
"id": 1,
"navn": "Nesheimshorgi",
"beskrivelse": "Flottaste utsikta over Granvinsvatnet.",
"hoyde": 1134
}
]
GET /fjell/:id/bilder
Returnerer alle bilder for ett fjell.
Eksempelrespons:
[
{
"id": 7,
"sti": "uploads/1742400000000-123456789.jpg",
"navn": "mitt-bilde.jpg",
"alternativtekst": "Utsikt fra toppen",
"fjellid": 1
}
]
POST /fjell/:id/bilder
Tar imot ett bilde i feltet bilde + valgfri alternativtekst.
- Content-Type: multipart/form-data
- Felter:
- bilde (fil, påkrevd)
- alternativtekst (tekst, valgfritt)
Ved suksess returneres en JSON-melding.
Hvorfor vi lagrer både fil og database-rad
Bildefilen alene er ikke nok. Vi trenger også informasjon om:
- hvilket fjell bildet tilhører,
- hva bildet heter,
- alternativtekst for tilgjengelighet,
- hvor filen ligger.
Derfor:
- filen lagres i public/uploads,
- metadata lagres i tabellen bilde.
Oppsummering
- frontend velger fjell og sender fil,
- multer lagrer filen,
- SQLite lagrer metadata,
- frontend henter og viser bilder på nytt.