Spaces presigned link upload failing CORS despite configuration from dashboard

I have loosened up CORS to the max from the Digital Ocean Spaces dashboard as seen in screenshot here -

I did this per the comment here -

I create a signed URL in backend like this:

import { S3Client as S3ClientConstructor } from '@aws-sdk/client-s3';
import { PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const Spaces = new S3ClientConstructor({
  endpoint: '',
  region: 'sfo2',
  forcePathStyle: false,
  credentials: {
    accessKeyId: process.env.DO_ACCESS_KEY_ID,
    secretAccessKey: process.env.DO_SECRET_ACCESS_KEY

const uploadUrl = await getSignedUrl(
    new PutObjectCommand({
      Bucket: 'my bucket',
      ACL: 'public-read',
      // Folder
      Key: 'dev'
      // 10min
      expiresIn: 600

I then upload from the HTML frontend file picker like this:

          onChange={async function upload(e) {

            if (! {
              // User canceled the file browser.

            try {
              const uploadUrl = await fetchPresignedUrl();

              const file =[0];
              const formData = new FormData();
              formData.append('file', file);

              const res = await fetch(uploadUrl, {
                method: 'PUT',
                body: formData,
                headers: {
                  'Content-Type': file.type,
                  'x-amz-acl': 'public-read'

              console.log('res.status:', res.status);
            } finally {

However this still gives me CORS error like this:

(Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 403.

The redacted presigned URL was:******Faws4_request&X-Amz-Date=20230228T194311Z&X-Amz-Expires=600&X-Amz-Signature=***********&X-Amz-SignedHeaders=host&x-amz-acl=public-read&x-id=PutObject

Anyone have any ideas on how to fix this?

Submit an answer
Answer a question...

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Sign In or Sign Up to Answer