我正在开发一个轨道应用程序,我使用带有雾存储的载波。我的表单中有几个字段,用户可以在其中提交应用程序(名称、短描述和长描述、图像字段)。上传文件的名称是从我的表单“名称”字段中的名称中获取的。
例如,当我上传名为 Notepad
的文件时,一切正常,图像会显示在我的应用程序页面上。但是,当我在表单字段中上传名为 Notepad++
的图像时,它已成功上传到亚马逊,但我得到的图像已损坏。查看其源代码并尝试打开其 url 会产生错误
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>0DBACCF4C0301B02</RequestId>
<HostId>
raYVzr9xubG0NA/b57saIJzfc2YhnvhD0tafYmo34ewOBY6/0j1AKUFC/lEoY+6h
</HostId>
</Error>
所有带有加号的名称都会发生这种情况。可能是什么问题呢。我已经尽了一切努力,但一无所获。这是我的 image_uploader 类
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :fog
include CarrierWave::MimeTypes
process :set_content_type
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.name.to_s.downcase.underscore || model.id.to_s.underscore.downcase}"
end
def filename
"#{model.name.to_s.underscore.downcase}-#{secure_token}" if original_filename.present?
end
def default_url
"fallback/#{model.class.to_s.underscore}/" + [version_name, "noimage.gif"].compact.join('_')
end
version :nano_thumb do
process :resize_to_fill => [20, 20]
end
version :mini_thumb do
process :resize_to_fill => [25, 25]
end
version :small_thumb do
process :resize_to_fill => [34, 34]
end
version :thumb do
process :resize_to_fill => [48, 48]
end
version :small do
process :resize_to_fill => [86, 86]
end
version :medium do
process :resize_to_fill => [259, 259]
end
version :large do
process :resize_to_fill => [518, 518]
end
def extension_white_list
["jpg", "jpeg", "gif", "png", ""]
end
protected
def secure_token(length=9)
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
end
end
谢谢
最佳答案
这是载波中的一个已知问题,已在 master 上修复,但尚未发布。您的选择是:
使用 Carrierwave Master 而不是官方 Gem 版本。
更新sanitize_regexp排除 + 字符。
CarrierWave::SanitizedFile.sanitize_regexp =/[^a-zA-Z0-9.-_]/
新上传将适用于其中任何一个,但您仍然需要手动修复旧上传(通过 s3 挖掘以找到正确的文件名,然后更新数据库)。或者直接删除它们。
关于amazon-s3 - 读取带有 "+"符号的 S3 存储桶文件时 Amazon S3 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16307447/