我正在尝试从浏览器将图像上传到数字海洋空间。这些图像应该是公开的。我能够成功上传图像。
然而,尽管 ACL 设置为public-read
,上传的文件始终是私有的.
我知道它们是私有的,因为 a) 仪表板显示权限是“私有”,b) 因为公共 URL 不起作用,c) 在仪表板中手动将权限更改为“公共”可以修复所有问题。
这是我正在使用的总体流程。
- 在后端创建预签名 URL
- 将该 url 发送到浏览器
- 将图像上传到该预签名 URL
有什么想法为什么这些图像不公开吗?
Code
以下示例以 TypeScript 编写并使用 AWS 的 v3 SDK。
Backend
这会生成用于上传文件的预签名 URL。
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
const client = new S3Client({
region: 'nyc3',
endpoint: 'https://nyc3.digitaloceanspaces.com',
credentials: {
accessKeyId: process.env.DIGITAL_OCEAN_SPACES_KEY,
secretAccessKey: process.env.DIGITAL_OCEAN_SPACES_SECRET,
},
})
const command = new PutObjectCommand({
ACL: 'public-read',
Bucket: 'bucket-name',
Key: fileName,
ContentType: mime,
})
const url = await getSignedUrl(client, command)
然后将预签名的 URL 发送到浏览器。
Frontend
这是客户端上实际将文件上传到 Digital Ocean 的代码。file
is a 文件对象 https://developer.mozilla.org/en-US/docs/Web/API/File.
const uploadResponse = await fetch(url, {
headers: {
'Content-Type': file.type,
'Cache-Control': 'public,max-age=31536000,immutable',
},
body: file,
method: 'PUT',
})
Metadata