本文介绍了无法将具有ACL公共读取的文件上载到数字海洋空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从浏览器将图像上载到数字海洋空间。这些图片应该是公开的。我能够成功上载图像。

但是,尽管ACL设置为public-read,但上载的文件始终是私有的

我知道它们是私有的,因为a)仪表板显示权限是";private";,b)因为公共URL不起作用,c)在仪表板中手动将权限更改为";public";可以修复所有问题。

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

  1. 在后台创建预签名URL
  2. 将该URL发送到浏览器
  3. 将图像上载到该预先签名的URL

您知道为什么这些图像不公开吗?

代码

以下示例是用TypeScript编写的,并使用AWS的v3 SDK。

后端

这将生成用于上载文件的预签名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发送到浏览器。

前端

这是客户端上实际将文件上传到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 SDK:3.8.0

acl

原来,对于数字海洋,您还需要将public-read推荐答案设置为PUT请求中的头部。

//front-end
const uploadResponse = await fetch(url, {
    headers: {
        'Content-Type': file.type,
        'Cache-Control': 'public,max-age=31536000,immutable',
        'x-amz-acl': 'public-read', // add this line
    },
    body: file,
    method: 'PUT',
})

这篇关于无法将具有ACL公共读取的文件上载到数字海洋空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-18 19:34