首页 > 解决方案 > 从 Rails 后端直接上传的 AWS S3 会生成具有十六进制名称且没有文件扩展名的 S3 存储桶项目

问题描述

任何人都对 S3 有此问题,您从 rails 后端存储的文件未显示为您在附加方法中指定的文件名?例如:

    book.epub.attach(io: File.open("<filepath>/tangrenjie.epub"), filename: "rangrenjie.epub", content_type: 'application/epub+zip')

这导致文件在 S3 上的名称为“qsqyksxtpq66uk6vvyn6mtam17cp”:

这是存储桶外观的屏幕截图; 存储桶是公开的,当您单击每个链接时,所有链接都会下载,但是任何需要 src url 的东西都不起作用

我在 S3 控制台上手动上传了一个,一切正常。它的名字没有改变,这让我认为这是从 Rails 到 S3 的问题。

我尝试添加到 S3 上的 CORS 选项卡;但我不确定我会放什么

  1. rails 发送凭据,文件确实到达 S3 和
  2. 我不认为 localhost 算作一个域

这不是问题,但我正在使用的依赖项需要一个公共 url——我在 S3 上手动上传的文件的 url 有效(当然),但我的 rails 应用程序中的所有内容最终都会获得一个巨大的密钥它的文件名没有任何文件扩展名(见截图),当我在我的应用程序中将它们用作 src url 时它们不起作用。

我已经阅读了https://edgeguides.rubyonrails.org/active_storage_overview.html#s3-service-amazon-s3-and-s3-compatible-apis之类的指南

我一直在从我正在使用的依赖项的作者那里获得帮助,但他不知道,因为他有一段时间没有使用 S3。

这是我在 S3 中的当前 CORS 规则:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
    </CORSRule>
</CORSConfiguration>

我将 rails 6.0.3 用作带有 ActiveStorage 的 api 以及 AWS S3 服务,使用 aws-sdk-s3 gem,使用 root 用户凭证来存储与 rails 后端应用程序上的对象关联的文件。

标签: amazon-s3backendruby-on-rails-6rails-activestorage

解决方案


推荐阅读