Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.usehasp.com/llms.txt

Use this file to discover all available pages before exploring further.

File fields store a fileId string. This page covers the full lifecycle: uploading a file and retrieving a download URL.

requestFileUpload(options, signal?)

Requests a presigned upload URL.
const upload = await sdk.requestFileUpload({
  fieldKey: 'attachment',         // the file field key in your entity schema
  fileName: 'invoice.pdf',
  mimeType: 'application/pdf',    // optional but recommended
  sizeBytes: file.size,
});

// upload.fileId     — the ID to store on the record
// upload.uploadUrl  — presigned PUT URL (expires in ~15 minutes)
// upload.headers    — headers to include in the PUT request

Upload the File

After receiving the presigned URL, PUT the file bytes directly to storage. The file never passes through your app’s server.
await fetch(upload.uploadUrl, {
  method: 'PUT',
  headers: {
    'Content-Type': file.type,
    ...upload.headers,
  },
  body: file,   // File or Blob
});

Save the fileId on the Record

After the upload completes, store the fileId in the record:
await sdk.updateRecord('expenses', recordId, {
  attachment: upload.fileId,
});

Complete Example

async function uploadAttachment(recordId, file) {
  const upload = await sdk.requestFileUpload({
    fieldKey: 'attachment',
    fileName: file.name,
    mimeType: file.type,
    sizeBytes: file.size,
  });

  const uploadResponse = await fetch(upload.uploadUrl, {
    method: 'PUT',
    headers: { 'Content-Type': file.type, ...upload.headers },
    body: file,
  });

  if (!uploadResponse.ok) {
    throw new Error('Upload to storage failed');
  }

  await sdk.updateRecord('expenses', recordId, {
    attachment: upload.fileId,
  });
}
If the presigned URL expires before the upload completes, call requestFileUpload again to obtain a fresh URL and retry the PUT.

getFileUrl(fileId, signal?)

Returns a presigned download URL for a file attachment.
const file = await sdk.getFileUrl(record.attachment);
// file.url         — presigned download URL (valid for ~1 hour)
// file.fileName    — original file name as uploaded
// file.mimeType    — MIME type, or null if not recorded at upload
// file.expiresAt   — ISO 8601 expiry timestamp
Opening the file in a new tab:
const file = await sdk.getFileUrl(record.attachment);
window.open(file.url, '_blank');
Triggering a download:
const file = await sdk.getFileUrl(record.attachment);
const a = document.createElement('a');
a.href = file.url;
a.download = file.fileName;
a.click();
The presigned URL is valid for ~1 hour. Do not cache it long-term — call getFileUrl again if you need a fresh URL.

Limits

TierMax single fileMax attachment storage
Standard10 MB250 MB
Enterprise50 MB5 GB
Attempting to upload a file that exceeds the storage quota throws ErrorCode.StorageLimitReached.