无法将带有 ACL 公开读取的文件上传到 Digital Ocean 空间 后端前端

问题描述

我正在尝试从浏览器将图像上传到 Digital Ocean 空间。这些图像应该是公开的。我可以成功上传图片

然而,虽然 ACL 设置为 public-read,但上传文件始终是私密的

我知道它们是私有的,因为 a) 仪表板说权限是“私有的”,并且 b) 因为公共 URL 不起作用,以及 c) 在仪表板修复中手动将权限更改为“公共”一切。

这是我正在使用的整体流程。

  1. 在后端创建一个预签名的 URL
  2. 将该网址发送到浏览器
  3. 图片上传到该预签名网址

知道图片不公开的原因吗?

代码

以下示例使用 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 的代码fileFile 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...