Fileupload
Release dato: 16.02.2026
Sist oppdatert: 18.02.2026
File upload lar brukeren laste opp vedlegg og bilder. Komponenten stÞtter drag and drop, filvelger, flere filer, kommentarer og forhÄndsvisning av bilder. Dette krever at serveren som tar i mot skjemadataene stÞtter filopplasting. PÄ mobil kan man brukeren velge Ä ta et bilde med kamera, eller velge en eksisterende fil.
Test komponenten
Relaterte komponenter
For fritekst nÄr fil ikke trengs, f.eks. for kommentarer.
For feil og status ved opplasting.
For Ä vise fremdrift pÄ opplasting.
Varianter
File upload kan brukes i to forskjellige typer basert pÄ hva du forventer at brukeren skal laste opp.
| Type | Bruk |
|---|---|
| Vedlegg | Laster opp dokumenter og andre filtyper, viser filnavn i listeform |
| Bilde | Laster opp bilder og viser forhÄndsvisning i kort |
File upload gir ogsÄ muligheten til mer funskjonalitet i de opplastede filene (dette gjelder ikke bildevisningen).
| Funksjonalitet | Bruk |
|---|---|
| Statisk | Viser liste over filer med navn |
| Med kommentar | Viser feltet âLegg til kommentarâ ved hver fil |
| Med navneendringer | Lar brukeren redigere visningsnavnet til filen |
Retningslinjer for bruk
Bruk file upload nÄr
- brukeren skal sende inn dokumentasjon, skjema, kvitteringer eller bilder som del av en prosess
UnngÄ fileupload nÄr
- du egentlig bare ber brukeren velge noe som allerede finnes i systemet, da er det bedre med select, combobox eller sĂžk
- du bruker filopplasting som en omvei for informasjon som kunne vĂŠrt fylt inn som tekst
NÄr skal du bruke bilde-preview i file upload?
Bruk bildevarianten (preview) nÄr det viktigste for brukeren er Ä se hva bildet viser, ikke bare hvilket filnavn det har.
- Vis forhÄndsvisning i et kort med filnavn og handling
- Vurder Ă„ begrense antall bilder, og fortell tydelig hvis det er en Ăžvre grense
Vi anbefaler ikke Ä kombinere preview av bilder og filer, dersom bruker kan laste opp bÄde bilder og filer, anbefaler vi vanlig listevisning av opplastede elementer.
Merk: Hvis dere bruker en streng CSP i produksjon og Þnsker lokal bilde-forhÄndsvisning (thumbnail), mÄ img-src tillate blob:. Hold dette avgrenset til img-src (ikke script-src).
Gi tydelig tilbakemelding pÄ status
Vis alltid hvilket steg filen er i: venter, laster opp, ferdig eller feilet. Det kan vÊre lurt Ä bruk fremdriftsindikator for stÞrre filer eller nÄr opplastning kan ta tid.
Husk at status ogsÄ mÄ vÊre lesbar med skjermleser, ikke bare med farge og animasjon.
Drag and drop med alternativ
Drag and drop oppleves effektivt, men kan vÊre vanskelig for enkelte brukere og pÄ mobil. Selv om komponenten er fleksibel, anbefaler vi Ä alltid ha bÄde drag and drop og lenke for Ä velge fil/bilde, og unngÄ Ä gjÞre drag and drop til eneste mÄte Ä laste opp filer pÄ.
GjĂžr slik
UnngÄ
Gi nok informasjon og riktig feilmelding
- Tillat bare relevante filformater, og vis dette eksplisitt i hjelpeteksten inne i selve feltet. Dette kan presiseres i hjelpetekst.
- Sett en fornuftig grense for filstĂžrrelse, og forklar hvorfor store filer ikke kan lastes opp.
- Gi konkrete rÄd ved feil, for eksempel at brukeren kan komprimere et bilde eller lagre som et annet format.
Feilmeldingen mÄ opptre i riktig kontekst. Gir du feil pÄ opplastet fil skal dette vises under hele feltet. Dersom det er en feil i filen eller opplastningen feiler, skal dette vises pÄ den aktuelle filen.
Responsivitet
File upload skal fungere godt pÄ alle skjermstÞrrelser og ikke dekke for mye av innholdet.
- Dropzonen skalerer i bredde
- PĂ„ smĂ„ skjermer kan linjelange filnavn brytes eller trunkeres med ââŠâ
- Drag and drop fungerer dÄrlig pÄ mobil, sÄ brukeren mÄ ha et alternativ. Gi brukeren mulighet til Ä klikke pÄ en lenke eller drop zonen med klikk.
Universell utforming
File upload er et skjemaelement og bĂžr fĂžlge de samme prinsippene som andre felter i Punkt.
Feilmeldinger
Feilmeldinger skal vĂŠre tydelige, konkrete og plassert nĂŠr feltet:
- Fortell hva som er feil, og hva brukeren mÄ gjÞre for Ä rette det
- Marker bÄde komponenten og den konkrete filen som har feil
- Ikke vis feilmeldinger kun med fargeendring
Les mer om universell utforming av file upload:
Skriv gode ledetekster og instruksjoner i skjema
Tips til hvordan du skriver gode, tydelige ledetekster
Anatomi
| Element | Beskrivelse |
|---|---|
| 1. Label | Tittel/etikett over feltet (valgfritt) |
| 2. Hjelpetekst | Forklaring under feltet (valgfritt) |
| 3. Dropzone | Gir brukeren mulighet til Ă„ dra inn filer |
| 4. Beskrivende tekst | Tekst med lenke og informasjon om filformat |
| 5. Fil under opplastning | Fil som lastes opp (med progressbar) |
| 6. Ferdig opplastet fil | Fil som er lastet opp |
| 7. Handlinger | Mulighet for Ă„ legge til handlinger (rediger, kommentar eller slett) |
Implementasjon i kode
Hvordan ta komponenten i bruk?
import { PktFileUpload } from '@oslokommune/punkt-react'; Testing
For web component-varianten (<pkt-fileupload>), mÄ dere i JSDOM (eller liknende) vente til custom elementet er registrert fÞr dere tester:
await window.customElements.whenDefined("pkt-fileupload");For React-komponenten (PktFileUpload) trengs ikke dette, men i testmiljÞ kan dere mÄtte polyfille ResizeObserver og DataTransfer.
data-testid (og andre input-attributter) videresendes til den underliggende native <input type="file">.
Bruk i skjema
Controlled eller uncontrolled?
Komponenten kan brukes pÄ begge mÄter. Begge implementasjoner oppfÞrer seg likt: sett value (+ en endringshÄndterer) for controlled, eller defaultValue for uncontrolled. Hvis bÄde value og defaultValue er satt vinner value, og begge implementasjoner logger en advarsel.
| Mode | Viktige props | Hva det gir |
|---|---|---|
| Uncontrolled | defaultValue | Enkel oppstart med intern state i komponenten. |
| Controlled | value + files-changed handler | Full kontroll i parent/store/backend-flyt. |
| Situasjon | Anbefaling | Hvorfor |
|---|---|---|
| Enkelt skjema, lokal filhÄndtering | Uncontrolled | Minst mulig kode og wiring. |
| Stegskjema, global state eller autosave | Controlled | Parent kan styre reset, restore og synkronisering. |
Egen opplastingslogikk (uploadStrategy="custom") | Controlled (anbefalt) | Parent mÄ styre filstatus og eventuelle transfer-data. |
Controlled-modus alene slÄr ikke pÄ framdriftsindikatoren. Tre ting mÄ vÊre pÄ plass for Ä vise progress per fil:
uploadStrategy="custom"â appen hĂ„ndterer selve opplastingen.- Appen mater transfer-status tilbake via
transfers-propen. - Queue-en rendrer framdrift ut fra disse verdiene (skjer automatisk nÄr de to over er satt).
Opplastingsstrategi
Uansett kan komponenten brukes pÄ to forskjellige mÄter:
- med
uploadStrategy="form", hvor komponenten oppfÞrer seg som en<input type='file' />. Brukeren velger en eller (vedmultiple) flere filer, og disse lastes opp nÄr brukeren submitter skjemaet. - med
uploadStrategy="custom", hvor webapplikasjonen mÄ implementere egen logikk for Ä laste opp filer, for eksempel via XHR. Dette gjÞr det mulig Ä vise en framdriftsindikator for opplastingen.
BÄde i form- og custom-modus kan komponenten ha noen tilleggsfunksjoner:
- mulighet for Ă„ angi eget filnavn (
renameFilesEnabled), hvor et ekstra input-felt lar brukeren angi et nytt filnavn - mulighet for Ă„ gi en kommentar til hver fil (
addCommentsEnabled), hvor et textarea lar brukeren skrive en kommentar i fritekst - (eksperimentelt) andre tilleggsfunksjoner kan plugges inn via
extraOperations. Hver operasjon er etQueueItemOperation-objekt med en stabilid, entitleog valgfrieonClick/renderInlineUI/renderExtendedUI/renderContent/renderHidden. Alle callbacks fÄr et fellescontext-objekt ({ file, disabled, isActive, activate, close, getAttribute, setAttribute, inputName }), som bÄde React og Lit deler.
Hvis opplasting av filer er pÄkrevd fÞr man trykker pÄ en eventuell submit-knapp, bruk required prop-en. Er uploadStrategy="form" settes dette pÄ native <input type="file">, slik at nettleserens vanlige skjemavalidering brukes. Bruker man derimot uploadStrategy="custom" valideres kravet ved submit, og en feilmelding vil vises med PktAlert-komponenten.
Her er et ganske komplett eksempel pÄ bruk av bÄde form- og custom-varianten:
Props og tokens
Egenskaper
| Prop | Type | Beskrivelse |
|---|---|---|
name | string | Navn for innsending |
label | string | Etikett/tittel over komponenten |
helptext | string | ReactNode | Hjelpetekst under etiketten |
required | boolean | GjÞr feltet obligatorisk. I `uploadStrategy='form'` brukes native validering pÄ file input. I `uploadStrategy='custom'` valideres kravet ved submit og komponenten viser feilmelding hvis ingen filer er valgt. |
value | FileItemList | Liste over filer i komponenten. Bruk denne for controlled-modus. |
defaultValue | FileItem[] | Default-verdi nÄr komponenten brukes 'uncontrolled'. Ingen grunn til at denne ikke skal vÊre tom array `[]` |
onFilesChanged | (files: FileItem[]) => void | Kalles nÄr fil(er) legges til, fjernes eller oppdateres |
uploadStrategy | formcustom | Velg mellom skjemaopplasting (filene sendes nÄr skjemaet sendes inn) og bakgrunnsopplasting (webappen hÄndterer opplasting via `onFileUploadRequested` og oppdaterer `transfers`). |
multiple | boolean | Tillat opplasting av flere filer |
itemRenderer | filenamethumbnail | Hvordan filer skal vises i opplastings-kÞen. Enten filnavn eller som thumbnails. Du kan ogsÄ (eksperimentelt) lage din egen komponent. |
optionalTag | boolean | Vis 'Valgfritt'-tag ved etiketten |
requiredTag | boolean | Vis 'MĂ„ fylles ut'-tag ved etiketten |
disabled | boolean | Deaktiverer hele komponenten - ingen interaksjon mulig |
errorMessage | string | Feilmelding for Ă„ vise under komponenten (ekstern/programmatisk feil) |
hasError | boolean | Om komponenten har en feiltilstand |
allowedFormats | string[] | Liste over tillatte filformater. F.eks. ['pdf', 'jpg', 'png'] eller ['image/*', 'application/pdf'] |
formatErrorMessage | string | Tilpasset feilmelding ved ugyldig filtype. |
maxFileSize | string | number | Maksimal filstĂžrrelse. F.eks. '5MB', '500KB', '1GB' eller antall bytes |
onFileValidation | (file: File) => string | null | KjĂžrer etter innebygd format/stĂžrrelse-validering. Returner feilmeldingsstreng hvis ugyldig, null hvis gyldig. |
sizeErrorMessage | string | Tilpasset feilmelding ved for stor fil. |
addCommentsEnabled | boolean | La brukeren skrive en kommentar pr fil. Kommentarene postes i felter med navn `{fileupload-navn}-comment` |
enableImagePreview | boolean | Aktiver forhÄndsvisning av bilder i modal (kun for thumbnail-visning) |
extraOperations | Array<QueueItemOperation> | Ekstra operasjoner pr fil (eksperimentelt). Hver operasjon er et objekt med stabil `id`, `title` og valgfrie `onClick`/`renderInlineUI`/`renderExtendedUI`/`renderContent`/`renderHidden`. Callbacks fÄr et `context`-objekt med file, disabled, isActive, activate, close, getAttribute og setAttribute. |
fullwidth | boolean | Om komponenten skal ta full bredde av foreldreelementet |
onFileUploadRequested | (fileItem: FileItem) => void | Ved uploadStrategy='custom' blir denne funksjonen kalt nÄr brukeren velger en eller flere filer. Dette lar webappen sette i gang opplasting i bakgrunnen. |
onTransferCancelled | (fileItemId: string) => void | Kalles nÄr brukeren klikker 'Slett' eller 'Avbryt'. Webappen mÄ dermed avbryte opplastingen av denne fila. |
renameFilesEnabled | boolean | La brukeren angi et navn pr fil. Filnavnene postes i felter med navn `{fileupload-navn}-targetFilename` |
transfers | Array<FileTransfer> | Ved uploadStrategy='custom' vil du fortelle komponenten om pÄgÄende overfÞringer her. Hver fil har en progress-verdi. |
truncateTail | number | Hvordan lange filnavn skal forkortes med ellipse i kĂžen. Med `4` vil filnavnet vises som `langt-filnavn-med ... .pdf`. Med verdi `0` kommer ellipsen til slutt. |
FileItem
En valgt fil i kĂžen. FileItemList er en array av FileItem. Brukes som parameter i callbacks som onFileUploadRequested og i FileItemList (value / defaultValue).
| Prop | Type | Beskrivelse |
|---|---|---|
fileId | string | Unik id for filen i komponenten. |
file | File | Fil-objektet fra nettleseren. |
attributes | Record<string, unknown> | Metadata per fil (f.eks. targetFilename for visningsnavn). |
FileTransfer
Status for én pÄgÄende opplasting nÄr uploadStrategy="custom".
| Prop | Type | Beskrivelse |
|---|---|---|
fileId | string | Kobler til FileItem.fileId. |
progress | number | 'done' | 'error' | 'canceled' | 'queued' | Fremdrift (0..1) eller tilstand. |
errorMessage | string | Feilmelding ved error. |
showProgress | boolean | Vis determinate progress vs. «Laster oppâŠÂ». |