我正在开发一种发布功能,用户可以在Rails中使用CKEditor创建新帖子。图片是使用载波上传到S3的。
我注意到一个问题,即数据库中的图像URL存储类似"https://somebucket.s3.amazonaws.com/freight/ckeditor/pictures/11/content_logos1_0000_Singapore-Logistics-Association.jpg?X-Amz-Expires=600&X-Amz-Date=20180626T094950Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIJ2MY37H6GCRA66Q/20180626/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=072ca2de6c07d8388c1ac338b110c05fba39329b9a8155689bfe040c555993e1"
此URL将过期。一分钟后,帖子将不再显示图像。
有没有办法解决这个问题?
更新:为此找到了解决方案:
将此代码添加到S3 Image Uploader类中,以使其生成公共URL,而不是预先签名的URL。
CkeditorPictureUploader类
答案 0 :(得分:0)
该网址将在一分钟后过期,因为这是一个 presigned-url ,它是指在特定时间间隔后过期,它们用于访问s3存储桶中的私有文件时间短。
如果您希望访问该URL的时间更长,则可以延长通过代码生成URL的时间,或者如果用例希望您的对象可被所有人公开访问,则可以改为公开您的对象,然后使用是s3托管网址指向该对象。
import boto3
s3Client = boto3.client('s3')
s3Client.generate_presigned_url('get_object', Params = {'Bucket': 'www.mybucket.com', 'Key': 'hello.txt'}, ExpiresIn = 100)
这是python中的一个示例,该示例生成一个预签名的url,该URL在100秒后失效
答案 1 :(得分:0)
您应该在图片上传器中设置到期时间
class CkeditorPictureUploader < CarrierWave::Uploader::Base
# rest of your code
# public all images
def fog_public
true
end
end