or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

access-control-security.mdbucket-configuration.mdbucket-operations.mdclient-configuration.mdindex.mdlisting-pagination.mdmultipart-upload.mdobject-operations.mdwaiters-utilities.md
tile.json

multipart-upload.mddocs/

Multipart Upload

Efficient handling of large file uploads through multipart upload operations, enabling parallel uploads, resume capability, and better error handling for large objects.

Capabilities

Create Multipart Upload

Initiate a multipart upload session for large objects.

/**
 * Initiate a multipart upload
 */
class CreateMultipartUploadCommand {
  constructor(input: CreateMultipartUploadCommandInput);
}

interface CreateMultipartUploadCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Object key for the upload */
  Key: string;
  
  /** Object permissions */
  ACL?: ObjectCannedACL;
  
  /** Cache control header */
  CacheControl?: string;
  
  /** Content disposition header */
  ContentDisposition?: string;
  
  /** Content encoding header */
  ContentEncoding?: string;
  
  /** Content language header */
  ContentLanguage?: string;
  
  /** Content type of the object */
  ContentType?: string;
  
  /** Object expiration date */
  Expires?: Date;
  
  /** User-defined metadata */
  Metadata?: Record<string, string>;
  
  /** Server-side encryption algorithm */
  ServerSideEncryption?: ServerSideEncryption;
  
  /** Storage class for the object */
  StorageClass?: StorageClass;
  
  /** Website redirect location */
  WebsiteRedirectLocation?: string;
  
  /** KMS key ID for encryption */
  SSEKMSKeyId?: string;
  
  /** KMS encryption context */
  SSEKMSEncryptionContext?: string;
  
  /** Bucket key enabled flag */
  BucketKeyEnabled?: boolean;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
  
  /** Object tagging */
  Tagging?: string;
  
  /** Object lock mode */
  ObjectLockMode?: ObjectLockMode;
  
  /** Object lock retain until date */
  ObjectLockRetainUntilDate?: Date;
  
  /** Object lock legal hold status */
  ObjectLockLegalHoldStatus?: ObjectLockLegalHoldStatus;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
  
  /** Checksum algorithm */
  ChecksumAlgorithm?: ChecksumAlgorithm;
}

interface CreateMultipartUploadCommandOutput {
  /** Abort date for incomplete upload */
  AbortDate?: Date;
  
  /** Abort rule ID */
  AbortRuleId?: string;
  
  /** Bucket name */
  Bucket?: string;
  
  /** Object key */
  Key?: string;
  
  /** Upload ID for subsequent operations */
  UploadId?: string;
  
  /** Server-side encryption used */
  ServerSideEncryption?: ServerSideEncryption;
  
  /** KMS key ID used */
  SSEKMSKeyId?: string;
  
  /** KMS encryption context */
  SSEKMSEncryptionContext?: string;
  
  /** Bucket key enabled flag */
  BucketKeyEnabled?: boolean;
  
  /** Request charged information */
  RequestCharged?: RequestCharged;
  
  /** Checksum algorithm used */
  ChecksumAlgorithm?: ChecksumAlgorithm;
}

Usage Example:

import { S3Client, CreateMultipartUploadCommand } from "@aws-sdk/client-s3";

const client = new S3Client({ region: "us-east-1" });

const createUpload = new CreateMultipartUploadCommand({
  Bucket: "large-files-bucket",
  Key: "videos/movie.mp4",
  ContentType: "video/mp4",
  Metadata: {
    "upload-source": "web-client",
    "file-category": "video"
  },
  StorageClass: "STANDARD_IA"
});

const uploadResponse = await client.send(createUpload);
const uploadId = uploadResponse.UploadId;
console.log(`Created multipart upload: ${uploadId}`);

Upload Parts

Upload individual parts of a multipart upload.

/**
 * Upload a part in a multipart upload
 */
class UploadPartCommand {
  constructor(input: UploadPartCommandInput);
}

interface UploadPartCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Object key */
  Key: string;
  
  /** Part number (1-10000) */
  PartNumber: number;
  
  /** Upload ID from CreateMultipartUpload */
  UploadId: string;
  
  /** Part content */
  Body?: StreamingBlobPayloadInputTypes;
  
  /** Content length in bytes */
  ContentLength?: number;
  
  /** Content MD5 hash */
  ContentMD5?: string;
  
  /** Checksum algorithm */
  ChecksumAlgorithm?: ChecksumAlgorithm;
  
  /** CRC32 checksum */
  ChecksumCRC32?: string;
  
  /** CRC32C checksum */
  ChecksumCRC32C?: string;
  
  /** SHA1 checksum */
  ChecksumSHA1?: string;
  
  /** SHA256 checksum */
  ChecksumSHA256?: string;
  
  /** SSE customer algorithm */
  SSECustomerAlgorithm?: string;
  
  /** SSE customer key */
  SSECustomerKey?: string;
  
  /** SSE customer key MD5 */
  SSECustomerKeyMD5?: string;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
}

interface UploadPartCommandOutput {
  /** Server-side encryption used */
  ServerSideEncryption?: ServerSideEncryption;
  
  /** ETag of the uploaded part */
  ETag?: string;
  
  /** Checksum values */
  ChecksumCRC32?: string;
  ChecksumCRC32C?: string;
  ChecksumSHA1?: string;
  ChecksumSHA256?: string;
  
  /** KMS key ID used */
  SSEKMSKeyId?: string;
  
  /** Bucket key enabled flag */
  BucketKeyEnabled?: boolean;
  
  /** Request charged information */
  RequestCharged?: RequestCharged;
}

Usage Example:

import { S3Client, UploadPartCommand } from "@aws-sdk/client-s3";
import { readFileSync } from "fs";

const client = new S3Client({ region: "us-east-1" });

// Upload parts in sequence or parallel
async function uploadParts(uploadId: string, filePath: string) {
  const fileData = readFileSync(filePath);
  const partSize = 5 * 1024 * 1024; // 5MB parts
  const parts = [];
  
  for (let i = 0; i < fileData.length; i += partSize) {
    const partNumber = Math.floor(i / partSize) + 1;
    const partData = fileData.slice(i, i + partSize);
    
    const uploadPart = new UploadPartCommand({
      Bucket: "large-files-bucket",
      Key: "videos/movie.mp4",
      PartNumber: partNumber,
      UploadId: uploadId,
      Body: partData
    });
    
    const partResponse = await client.send(uploadPart);
    parts.push({
      ETag: partResponse.ETag,
      PartNumber: partNumber
    });
    
    console.log(`Uploaded part ${partNumber}: ${partResponse.ETag}`);
  }
  
  return parts;
}

Upload Part Copy

Copy data from another S3 object as a part in multipart upload.

/**
 * Copy data from another object as a multipart upload part
 */
class UploadPartCopyCommand {
  constructor(input: UploadPartCopyCommandInput);
}

interface UploadPartCopyCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Source object path (bucket/key) */
  CopySource: string;
  
  /** Target object key */
  Key: string;
  
  /** Part number (1-10000) */
  PartNumber: number;
  
  /** Upload ID */
  UploadId: string;
  
  /** Byte range to copy from source */
  CopySourceRange?: string;
  
  /** Copy source if modified since */
  CopySourceIfModifiedSince?: Date;
  
  /** Copy source if unmodified since */
  CopySourceIfUnmodifiedSince?: Date;
  
  /** Copy source if ETag matches */
  CopySourceIfMatch?: string;
  
  /** Copy source if ETag doesn't match */
  CopySourceIfNoneMatch?: string;
  
  /** Source SSE customer algorithm */
  CopySourceSSECustomerAlgorithm?: string;
  
  /** Source SSE customer key */
  CopySourceSSECustomerKey?: string;
  
  /** Source SSE customer key MD5 */
  CopySourceSSECustomerKeyMD5?: string;
  
  /** Destination SSE customer algorithm */
  SSECustomerAlgorithm?: string;
  
  /** Destination SSE customer key */
  SSECustomerKey?: string;
  
  /** Destination SSE customer key MD5 */
  SSECustomerKeyMD5?: string;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
  
  /** Expected source bucket owner */
  ExpectedSourceBucketOwner?: string;
}

interface UploadPartCopyCommandOutput {
  /** Copy part result */
  CopyPartResult?: CopyPartResult;
  
  /** Copy source version ID */
  CopySourceVersionId?: string;
  
  /** Server-side encryption used */
  ServerSideEncryption?: ServerSideEncryption;
  
  /** KMS key ID used */
  SSEKMSKeyId?: string;
  
  /** Bucket key enabled flag */
  BucketKeyEnabled?: boolean;
  
  /** Request charged information */
  RequestCharged?: RequestCharged;
}

interface CopyPartResult {
  /** ETag of the copied part */
  ETag?: string;
  
  /** Last modified date */
  LastModified?: Date;
  
  /** Checksum values */
  ChecksumCRC32?: string;
  ChecksumCRC32C?: string;
  ChecksumSHA1?: string;
  ChecksumSHA256?: string;
}

Complete Multipart Upload

Finalize a multipart upload by combining all parts into a single object.

/**
 * Complete a multipart upload
 */
class CompleteMultipartUploadCommand {
  constructor(input: CompleteMultipartUploadCommandInput);
}

interface CompleteMultipartUploadCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Object key */
  Key: string;
  
  /** Upload ID */
  UploadId: string;
  
  /** List of completed parts */
  MultipartUpload?: CompletedMultipartUpload;
  
  /** Checksum CRC32 */
  ChecksumCRC32?: string;
  
  /** Checksum CRC32C */
  ChecksumCRC32C?: string;
  
  /** Checksum SHA1 */
  ChecksumSHA1?: string;
  
  /** Checksum SHA256 */
  ChecksumSHA256?: string;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
  
  /** SSE customer algorithm */
  SSECustomerAlgorithm?: string;
  
  /** SSE customer key */
  SSECustomerKey?: string;
  
  /** SSE customer key MD5 */
  SSECustomerKeyMD5?: string;
}

interface CompletedMultipartUpload {
  /** List of completed parts */
  Parts?: CompletedPart[];
}

interface CompletedPart {
  /** ETag from UploadPart response */
  ETag?: string;
  
  /** Checksum CRC32 */
  ChecksumCRC32?: string;
  
  /** Checksum CRC32C */
  ChecksumCRC32C?: string;
  
  /** Checksum SHA1 */
  ChecksumSHA1?: string;
  
  /** Checksum SHA256 */
  ChecksumSHA256?: string;
  
  /** Part number */
  PartNumber?: number;
}

interface CompleteMultipartUploadCommandOutput {
  /** Object location URL */
  Location?: string;
  
  /** Bucket name */
  Bucket?: string;
  
  /** Object key */
  Key?: string;
  
  /** Expiration info */
  Expiration?: string;
  
  /** ETag of completed object */
  ETag?: string;
  
  /** Checksum values */
  ChecksumCRC32?: string;
  ChecksumCRC32C?: string;
  ChecksumSHA1?: string;
  ChecksumSHA256?: string;
  
  /** Server-side encryption used */
  ServerSideEncryption?: ServerSideEncryption;
  
  /** Version ID of created object */
  VersionId?: string;
  
  /** KMS key ID used */
  SSEKMSKeyId?: string;
  
  /** Bucket key enabled flag */
  BucketKeyEnabled?: boolean;
  
  /** Request charged information */
  RequestCharged?: RequestCharged;
}

Usage Example:

import { S3Client, CompleteMultipartUploadCommand } from "@aws-sdk/client-s3";

const client = new S3Client({ region: "us-east-1" });

// Complete the upload with all parts
const completeUpload = new CompleteMultipartUploadCommand({
  Bucket: "large-files-bucket",
  Key: "videos/movie.mp4",
  UploadId: uploadId,
  MultipartUpload: {
    Parts: parts.map(part => ({
      ETag: part.ETag,
      PartNumber: part.PartNumber
    }))
  }
});

const completed = await client.send(completeUpload);
console.log(`Upload completed: ${completed.Location}`);

Abort Multipart Upload

Cancel an incomplete multipart upload and free up storage.

/**
 * Abort an incomplete multipart upload
 */
class AbortMultipartUploadCommand {
  constructor(input: AbortMultipartUploadCommandInput);
}

interface AbortMultipartUploadCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Object key */
  Key: string;
  
  /** Upload ID to abort */
  UploadId: string;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
}

interface AbortMultipartUploadCommandOutput {
  /** Request charged information */
  RequestCharged?: RequestCharged;
}

Usage Example:

import { S3Client, AbortMultipartUploadCommand } from "@aws-sdk/client-s3";

const client = new S3Client({ region: "us-east-1" });

// Abort upload on error or cancellation
const abortUpload = new AbortMultipartUploadCommand({
  Bucket: "large-files-bucket",
  Key: "videos/movie.mp4",
  UploadId: uploadId
});

await client.send(abortUpload);
console.log("Multipart upload aborted");

List Multipart Uploads

List active multipart uploads in a bucket.

/**
 * List active multipart uploads in a bucket
 */
class ListMultipartUploadsCommand {
  constructor(input: ListMultipartUploadsCommandInput);
}

interface ListMultipartUploadsCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Object key delimiter */
  Delimiter?: string;
  
  /** Encoding type for keys */
  EncodingType?: EncodingType;
  
  /** Key marker for pagination */
  KeyMarker?: string;
  
  /** Maximum uploads to return */
  MaxUploads?: number;
  
  /** Key prefix filter */
  Prefix?: string;
  
  /** Upload ID marker for pagination */
  UploadIdMarker?: string;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
}

interface ListMultipartUploadsCommandOutput {
  /** Bucket name */
  Bucket?: string;
  
  /** Key marker */
  KeyMarker?: string;
  
  /** Upload ID marker */
  UploadIdMarker?: string;
  
  /** Next key marker */
  NextKeyMarker?: string;
  
  /** Next upload ID marker */
  NextUploadIdMarker?: string;
  
  /** Maximum uploads requested */
  MaxUploads?: number;
  
  /** Truncation flag */
  IsTruncated?: boolean;
  
  /** List of active uploads */
  Uploads?: MultipartUpload[];
  
  /** Delimiter used */
  Delimiter?: string;
  
  /** Key prefix */
  Prefix?: string;
  
  /** Common prefixes */
  CommonPrefixes?: CommonPrefix[];
  
  /** Encoding type */
  EncodingType?: EncodingType;
  
  /** Request charged information */
  RequestCharged?: RequestCharged;
}

interface MultipartUpload {
  /** Upload ID */
  UploadId?: string;
  
  /** Object key */
  Key?: string;
  
  /** Upload initiation date */
  Initiated?: Date;
  
  /** Storage class */
  StorageClass?: StorageClass;
  
  /** Upload owner */
  Owner?: Owner;
  
  /** Upload initiator */
  Initiator?: Initiator;
  
  /** Checksum algorithm */
  ChecksumAlgorithm?: ChecksumAlgorithm;
}

List Parts

List uploaded parts for a specific multipart upload.

/**
 * List parts of a multipart upload
 */
class ListPartsCommand {
  constructor(input: ListPartsCommandInput);
}

interface ListPartsCommandInput {
  /** Target bucket name */
  Bucket: string;
  
  /** Object key */
  Key: string;
  
  /** Upload ID */
  UploadId: string;
  
  /** Maximum parts to return */
  MaxParts?: number;
  
  /** Part number marker for pagination */
  PartNumberMarker?: number;
  
  /** Request payer setting */
  RequestPayer?: RequestPayer;
  
  /** Expected bucket owner */
  ExpectedBucketOwner?: string;
  
  /** SSE customer algorithm */
  SSECustomerAlgorithm?: string;
  
  /** SSE customer key */
  SSECustomerKey?: string;
  
  /** SSE customer key MD5 */
  SSECustomerKeyMD5?: string;
}

interface ListPartsCommandOutput {
  /** Abort date */
  AbortDate?: Date;
  
  /** Abort rule ID */
  AbortRuleId?: string;
  
  /** Bucket name */
  Bucket?: string;
  
  /** Object key */
  Key?: string;
  
  /** Upload ID */
  UploadId?: string;
  
  /** Part number marker */
  PartNumberMarker?: number;
  
  /** Next part number marker */
  NextPartNumberMarker?: number;
  
  /** Maximum parts */
  MaxParts?: number;
  
  /** Truncation flag */
  IsTruncated?: boolean;
  
  /** List of parts */
  Parts?: Part[];
  
  /** Upload initiator */
  Initiator?: Initiator;
  
  /** Upload owner */
  Owner?: Owner;
  
  /** Storage class */
  StorageClass?: StorageClass;
  
  /** Request charged information */
  RequestCharged?: RequestCharged;
  
  /** Checksum algorithm */
  ChecksumAlgorithm?: ChecksumAlgorithm;
}

interface Part {
  /** Part number */
  PartNumber?: number;
  
  /** Last modified date */
  LastModified?: Date;
  
  /** ETag */
  ETag?: string;
  
  /** Size in bytes */
  Size?: number;
  
  /** Checksum values */
  ChecksumCRC32?: string;
  ChecksumCRC32C?: string;
  ChecksumSHA1?: string;
  ChecksumSHA256?: string;
}

Complete Multipart Upload Example:

import { 
  S3Client, 
  CreateMultipartUploadCommand,
  UploadPartCommand,
  CompleteMultipartUploadCommand,
  AbortMultipartUploadCommand
} from "@aws-sdk/client-s3";
import { readFileSync } from "fs";

async function uploadLargeFile(
  client: S3Client, 
  bucket: string, 
  key: string, 
  filePath: string
) {
  const fileData = readFileSync(filePath);
  const partSize = 5 * 1024 * 1024; // 5MB minimum
  
  // Step 1: Create multipart upload
  const createUpload = new CreateMultipartUploadCommand({
    Bucket: bucket,
    Key: key,
    ContentType: "application/octet-stream"
  });
  
  const { UploadId } = await client.send(createUpload);
  
  try {
    // Step 2: Upload parts
    const parts = [];
    for (let i = 0; i < fileData.length; i += partSize) {
      const partNumber = Math.floor(i / partSize) + 1;
      const partData = fileData.slice(i, i + partSize);
      
      const uploadPart = new UploadPartCommand({
        Bucket: bucket,
        Key: key,
        PartNumber: partNumber,
        UploadId: UploadId,
        Body: partData
      });
      
      const { ETag } = await client.send(uploadPart);
      parts.push({ ETag, PartNumber: partNumber });
    }
    
    // Step 3: Complete upload
    const completeUpload = new CompleteMultipartUploadCommand({
      Bucket: bucket,
      Key: key,
      UploadId: UploadId,
      MultipartUpload: { Parts: parts }
    });
    
    const result = await client.send(completeUpload);
    return result.Location;
    
  } catch (error) {
    // Step 4: Abort on error
    const abortUpload = new AbortMultipartUploadCommand({
      Bucket: bucket,
      Key: key,
      UploadId: UploadId
    });
    
    await client.send(abortUpload);
    throw error;
  }
}

// Usage
const client = new S3Client({ region: "us-east-1" });
const location = await uploadLargeFile(
  client,
  "my-bucket",
  "large-files/video.mp4",
  "./video.mp4"
);
console.log(`Upload completed: ${location}`);