问题描述
我正在尝试从浏览器将图像上传到 Digital Ocean 空间。这些图像应该是公开的。我可以成功上传图片。
然而,虽然 ACL 设置为 public-read
,但上传的文件始终是私密的。
我知道它们是私有的,因为 a) 仪表板说权限是“私有的”,并且 b) 因为公共 URL 不起作用,以及 c) 在仪表板修复中手动将权限更改为“公共”一切。
这是我正在使用的整体流程。
知道图片不公开的原因吗?
代码
以下示例使用 TypeScript 编写并使用 AWS 的 v3 SDK。
后端
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 发送到浏览器。
前端
这是客户端上将文件实际上传到 Digital Ocean 的代码。 file
是 File object。
const uploadResponse = await fetch(url,{
headers: {
'Content-Type': file.type,'Cache-Control': 'public,max-age=31536000,immutable',body: file,method: 'PUT',})
元数据
- AWS 开发工具包:3.8.0
解决方法
事实证明,对于 Digital Ocean,您还需要将 str(alphabet.find(char)+1)
ACL 设置为 put 请求中的标头。
public-read
,
试试这个来强制 ACL 在数字海洋空间中公开:
s3cmd --access_key=YOUR_ACCESS_KEY --secret_key=YOUR_SECRET_KEY --host=YOUR_BUCKET_REGION.digitaloceanspaces.com --host-bucket=YOUR_BUCKET_NAME.YOUR_BUCKET_REGION.digitaloceanspaces.com --region=YOUR_BUCKET_REGION setacl s3://YOUR_BUCKET_NAME --acl-public