Sist endret: 12. okt. 2026

Livssyklus for filoverføring

Livssyklus for filoverføring i Altinn 3 Formidling

Livssyklus for filoverføring i Formidling

Livssyklus for status i filoverføringer i Altinn Formidling, inkludert TUS-opplastingsfaser, glidende token-vinduer og mottakerhandlinger etter publisering.

Oversikt

En filoverføring går gjennom flere statuser fra opprettelse til sletting. Her viser vi Formidling som én sammenhengende livssyklus: initialiser → last opp (inkludert TUS) → publiser → mottakerhandlinger → slett.

Statusoversikt

Filoverføring (FileTransferStatus)

StatusBetydning
InitializedMetadata er opprettet; klar for opplasting
UploadStartedMinst én byte / TUS-opprettelse er godtatt
UploadProcessingSjekksum og/eller viruskanning pågår
PublishedTilgjengelig for nedlasting hos mottaker
AllConfirmedDownloadedAlle mottakere har bekreftet nedlasting
FailedOpplasting eller behandling feilet
PurgedInnhold er fjernet (TTL eller karens etter bekreftelse)
CancelledReservert i modellen; skrives ikke av nåværende API-stier

Mottaker (ActorFileTransferStatus)

StatusBetydning
InitializedMottaker er registrert ved initialisering
DownloadStartedMottaker har startet nedlasting
DownloadConfirmedMottaker har bekreftet nedlasting

Fullstendig livssyklus

flowchart TD Start([Start]) --> Init[Initialize File Transfer<br/>Status: Initialized<br/>Schedule purge at TTL<br/>default 30d · max 365d] Init --> Auth{Sender authenticated?} Auth -->|No| Unauth[End: 401 Unauthorized] Auth -->|Yes| UploadPath{Upload method} %% Legacy stream UploadPath -->|Legacy stream| LegacyStart[Status: UploadStarted] LegacyStart --> LegacyBody[Stream body to storage] LegacyBody -->|OK| ProcessingGate LegacyBody -->|Error| FailUpload[Status: Failed<br/>UploadFailed event] %% TUS UploadPath -->|TUS| TusCreate[TUS POST create<br/>Status: UploadStarted<br/>Single or partial Location] TusCreate --> TusKind{Upload shape} TusKind -->|Single file| TusPatch[TUS PATCH chunks<br/>withCredentials + CSRF] TusKind -->|Concatenation| TusPartials[Create partials<br/>Upload-Concat: partial] TusPartials --> TusPartialPatch[PATCH partials in parallel] TusPartialPatch --> TusFinal[POST final<br/>Upload-Concat: final; …] TusFinal --> OnComplete[OnFileComplete<br/>Enqueue finalize / concat] TusPatch --> TusActive{{Active TUS window<br/>Sliding UploadExpiration = 24h<br/>renewed on HEAD / PATCH / progress<br/>Stuck job: Failed after 24h idle<br/>if no activity in last 1h}} TusActive --> AuthGrace{{Auth during long upload<br/>Altinn JWT ~2 min · cookie 60 min sliding<br/>ID-Porten auth ~2h hard cap<br/>Expired bearer/cookie accepted for<br/>this fileTransferId while upload session<br/>active ≤ UploadExpiration}} AuthGrace -->|Client aborts / idle > 24h| TusExpired{{Upload no longer resumable<br/>Incomplete upload expired<br/>Awaiting stuck job}} AuthGrace -->|Upload complete| OnComplete OnComplete --> ConcatQ{Final concat?} ConcatQ -->|Yes| ConcatJob[Hangfire concat chain<br/>May set UploadProcessing early<br/>Retry delay 5s · locks 30m–2h] ConcatQ -->|No| PublishPrep ConcatJob -->|OK| PublishPrep[TusPublishUploadHandler<br/>Finalize staging blob] ConcatJob -->|Error| FailUpload PublishPrep --> ProcessingGate{Checksum or virus scan needed?} ProcessingGate -->|Yes| Proc[Status: UploadProcessing] ProcessingGate -->|No| PubDirect[Status: Published] Proc --> Checksum[Deferred checksum validation] Checksum -->|Mismatch| FailChecksum[Status: Failed<br/>Delete blob] Checksum -->|OK · no scan| PubFromProc[Status: Published] Checksum -->|OK · virus scan| ScanWait[Wait for malware scan result<br/>Altinn3Azure · max scan size 50 GB] ScanWait -->|No threats found| PubFromProc ScanWait -->|Malware / not clean| FailMalware[Status: Failed<br/>Delete storage<br/>Does not set Purged] PubDirect --> Published[Status: Published<br/>Ready for download] PubFromProc --> Published %% Recipient phase Published --> Recip{Recipient actions} Recip -->|GET download| DlStart[Actor: DownloadStarted<br/>Ranged: debounce 5 min] Recip -->|Confirm without download| ConfirmBlocked[400 · DownloadStarted required] DlStart --> AfterDl{Next} AfterDl -->|Confirm download| Confirmed[Actor: DownloadConfirmed] AfterDl -->|More downloads| DlStart Confirmed --> AllCheck{All recipients confirmed?} AllCheck -->|No| WaitOthers[Wait for remaining recipients] WaitOthers --> Recip AllCheck -->|Yes| AllDone[Status: AllConfirmedDownloaded] AllDone --> Grace{Purge after all confirmed?} Grace -->|Yes · default| GraceWait[Wait purge grace<br/>default PT2H · max PT24H] Grace -->|No| HoldUntilTTL[Keep until file TTL] GraceWait --> Purge[Status: Purged<br/>Delete storage · FilePurged event] HoldUntilTTL --> TTL[File TTL reached] TTL --> Purge Published -.->|TTL while published| TTL FailUpload --> EndFail([End: Failed]) FailChecksum --> EndFail FailMalware --> EndFail Unauth --> EndAuth([End]) ConfirmBlocked --> Recip Purge --> EndOk([End: Purged]) %% Stuck monitoring (side path) Stuck([Stuck job every 30 min]) -.->|UploadStarted > 24h<br/>no TUS activity 1h| FailUpload TusExpired -.-> Stuck Stuck -.->|UploadProcessing > 15 min| SlackProc[Slack alert only] Stuck -.->|Initialized but upload started<br/>> 15 min| SlackInit[Slack alert only] %% Styles — success / terminal / wait / error / auth style Start fill:#f9f,stroke:#333,stroke-width:2px style EndOk fill:#f9f,stroke:#333,stroke-width:2px style EndFail fill:#f9f,stroke:#333,stroke-width:2px style EndAuth fill:#f9f,stroke:#333,stroke-width:2px style Init fill:#99ff99,stroke:#333,stroke-width:2px style LegacyStart fill:#99ff99,stroke:#333,stroke-width:2px style TusCreate fill:#99ff99,stroke:#333,stroke-width:2px style Proc fill:#99ff99,stroke:#333,stroke-width:2px style Published fill:#99ff99,stroke:#333,stroke-width:2px style PubDirect fill:#99ff99,stroke:#333,stroke-width:2px style PubFromProc fill:#99ff99,stroke:#333,stroke-width:2px style DlStart fill:#99ff99,stroke:#333,stroke-width:2px style Confirmed fill:#99ff99,stroke:#333,stroke-width:2px style AllDone fill:#99ff99,stroke:#333,stroke-width:2px style Purge fill:#87ceeb,stroke:#333,stroke-width:2px style TusActive fill:#99ccff,stroke:#333,stroke-width:2px style AuthGrace fill:#99ccff,stroke:#333,stroke-width:2px style GraceWait fill:#99ccff,stroke:#333,stroke-width:2px style ScanWait fill:#99ccff,stroke:#333,stroke-width:2px style HoldUntilTTL fill:#99ccff,stroke:#333,stroke-width:2px style TusExpired fill:#99ccff,stroke:#333,stroke-width:2px style FailUpload fill:#ff9999,stroke:#333,stroke-width:2px style FailChecksum fill:#ff9999,stroke:#333,stroke-width:2px style FailMalware fill:#ff9999,stroke:#333,stroke-width:2px style Unauth fill:#ff9999,stroke:#333,stroke-width:2px style ConfirmBlocked fill:#ffcc99,stroke:#333,stroke-width:2px style SlackProc fill:#ffcc99,stroke:#333,stroke-width:2px style SlackInit fill:#ffcc99,stroke:#333,stroke-width:2px

Fargeforklaring: grønn = vellykkede statusmilepæler · blå = venting / glidende vinduer · rød = feil · oransje = varsel eller klientfeil · rosa = start/slutt · lys blå = slettet (Purged).

Viktige tidsintervaller

EmneStandardMerknader
Ufullstendig TUS-opplasting24 timer glidendeTusOptions.UploadExpiration; fornyes ved opplastingsaktivitet
Fastlåst UploadStarted → Failed24 timer inaktivitetHoppes over hvis TUS-aktivitet innen siste 1 time
Fastlåst UploadProcessing15 minKun Slack-varsling
Brokerbox-sesjonscookie60 min glidendeForlenges av vellykket API-/TUS-trafikk
Altinn-token i cookieca. 2 minByttes på nytt via ID-Porten-oppdatering så lenge det er mulig
ID-Porten-autorisasjonca. 2 timer hard grenseEtter det kan TUS fortsette med karens for aktiv opplastingsøkt for samme fileTransferId
TTL for filoverføring30 dager (maks 365 dager)Planlegger sletting ved utløp når du initialiserer
Sletting etter at alle har bekreftetPT2H (maks PT24H)Karens som kan konfigureres per ressurs
Størrelsesgrense for viruskanning50 GBStørre filer kan hoppe over skanning avhengig av konfigurasjon

Viktige punkter

  • Opplastingsfasen er enten strømmeopplasting (legacy) eller TUS (inkludert parallelle deler og endelig concatenation).
  • Gjenopptak for ufullstendige TUS-opplastinger er et glidende 24-timers vindu uten aktivitet, ikke klokketid fra opprettelse.
  • Opplasting i nettleser over natten kan overleve ID-Porten-innlogging ved at en utløpt sesjon godtas kun for en allerede aktiv TUS-opplasting på den filoverføringen.
  • Published er tilstanden for nedlasting (det finnes ingen egen Available-status).
  • Feil på grunn av skadelig programvare sletter lagringen og setter Failed; den flytter ikke overføringen til Purged.
  • Mottakerbekreftelse krever tidligere DownloadStarted; når alle har bekreftet, kjører eventuell karenstid før sletting.