# Multipart Hooks (https://s3.dimah.dev/docs/server/hooks/multipart)



Enable multipart support on large-file routes by setting `upload.multipart: true` or passing a `MultipartConfig` object.

```ts title="lib/s3.ts"
import { S3Client } from "@aws-sdk/client-s3";
import { dimahS3, route } from "@dimah-s3/server";

export const awsS3 = new S3Client({/* env */});

export const s3 = dimahS3({
  client: awsS3,
  bucket: process.env.S3_BUCKET!,
  routes: {
    video: route({
      upload: {
        fileTypes: ["video/*"],
        maxFileSize: 500 * 1024 * 1024, // 500MB
        multipart: true,
        onConfirmed: async ({ key, contentLength }) => {
          // Triggered on successful multipart completion
        },
      },
    }),
  },
});
```

***

## Multipart lifecycle flow [#multipart-lifecycle-flow]

<Flow
  label="Multipart upload flow"
  steps="[
  { name: &#x22;upload.guard&#x22;, kind: &#x22;hook&#x22;, note: &#x22;Init validation&#x22; },
  { name: &#x22;CreateMultipartUpload&#x22;, kind: &#x22;s3&#x22; },
  { name: &#x22;multipart.guard&#x22;, kind: &#x22;hook&#x22;, note: &#x22;Authorizes each part&#x22; },
  { name: &#x22;CompleteMultipartUpload&#x22;, kind: &#x22;s3&#x22; },
  { name: &#x22;HeadObject&#x22;, kind: &#x22;server&#x22; },
  { name: &#x22;onConfirmed&#x22;, kind: &#x22;hook&#x22;, note: &#x22;Final metadata&#x22; },
]"
/>

***

## Type reference [#type-reference]

```ts
import type {
  MultipartConfig,
  MultipartOnInitContext,
  MultipartGuardContext,
  MultipartOnAbortContext,
  MultipartOnListContext,
} from "@dimah-s3/server";
```

### MultipartConfig [#multipartconfig]

<AutoTypeTable path="packages/server/src/types/config.ts" name="MultipartConfig" />

***

### MultipartOnInitContext [#multipartoninitcontext]

<AutoTypeTable path="packages/server/src/types/hook-contexts.ts" name="MultipartOnInitContext" />

***

### MultipartGuardContext [#multipartguardcontext]

<AutoTypeTable path="packages/server/src/types/hook-contexts.ts" name="MultipartGuardContext" />

***

### MultipartOnAbortContext [#multipartonabortcontext]

<AutoTypeTable path="packages/server/src/types/hook-contexts.ts" name="MultipartOnAbortContext" />

***

### MultipartOnListContext [#multipartonlistcontext]

<AutoTypeTable path="packages/server/src/types/hook-contexts.ts" name="MultipartOnListContext" />

## Frequently asked questions [#frequently-asked-questions]

<Accordions>
  <Accordion title="Does multipart upload require a second confirm call?">
    No. The final assembly step (`multipart.complete`) internally runs `upload.confirmGuard`, queries `HeadObject`, and calls `upload.onConfirmed`.
  </Accordion>

  <Accordion title="How do I enforce part size and total size bounds?">
    The server automatically validates each part size during `signPart` and sums uploaded part sizes before calling `CompleteMultipartUpload`. If total parts exceed `maxFileSize`, the upload is aborted with `PAYLOAD_TOO_LARGE`.
  </Accordion>
</Accordions>
