我用的富文本编辑器是 summernote,对应的 gem 是这个:
https://github.com/summernote/summernote-rails
图片存储服务用的是阿里云的 oss,刚开始都没问题,文章编辑完发布后能正常显示,但过了差不多一个小时,重新打开文章发现图片都不能正常显示,请问是什么问题呢?
好像是的。
https://snugnestbucket.oss-cn-beijing.aliyuncs.com/uploads/article/cover/1/feature_image.jpg?OSSAccessKeyId=LTAIVGpDOrlUIK18&Expires=1519485405&Signature=0BAN%2BWOIi1cgqOamSaoUMrrGs%2Fs%3D
这个是我绑定的文章封面,用@article.cover.url获取的,在页面中始终正常显示,单独输入链接也能显示图片
http://snugnestbucket.oss-cn-beijing.aliyuncs.com/uploads/article/cover/1/feature_image.jpg?Expires=1519485922&OSSAccessKeyId=TMP.AQHu4ruzvjkfrCvI0IOpdCn-MVn48LNrf3IMlu23WyLcJhAtnIVDL1NfiKT-ADAtAhQDTVzlYsqkLbIWqWwo2SmcG9wk7QIVAMZaXqAVsjhCDn7cqE5BJeKJoh8_&Signature=gZOS1F2sMaop%2FFaaEZirj6nErD0%3D
这个链接和上面哪个是同一个文件,直接在浏览器地址中输入也能显示
http://snugnestbucket.oss-cn-beijing.aliyuncs.com/uploads/upload/image/12/JM_House_Ourem_003.jpg?Expires=1519485720&
OSSAccessKeyId=TMP.AQHu4ruzvjkfrCvI0IOpdCn-MVn48LNrf3IMlu23WyLcJhAtnIVDL1NfiKT-ADAtAhQDTVzlYsqkLbIWqWwo2SmcG9wk7QIVAMZaXqAVsjhCDn7cqE5BJeKJoh8_&Signature=HIuJTkx0YkbU987Il6hrfLvDJcI%3D
这张图片我是要放在富文本里的,这个地址是我直接从oss中复制出来的,可以正常显示
https://snugnestbucket.oss-cn-beijing.aliyuncs.com/uploads/upload/image/12/JM_House_Ourem_003.jpg?OSSAccessKeyId=LTAIVGpDOrlUIK18&Expires=1519472212&Signature=5Xp4ud%2F%2B80hMXyJ9RAw7ITJjnK0%3D
这个就是上一张要在富文本中使用的图片,这个地址就是显示在我的网页中的,不能显示
请问该怎么处理呢?
Error>
<Code>AccessDenied</Code>
<Message>Request has expired.</Message>
<RequestId>5A917B64A1A55CFCE01DDBD2</RequestId>
<HostId>snugnestbucket.oss-cn-beijing.aliyuncs.com</HostId>
<Expires>2018-02-24T11:36:52.000Z</Expires>
<ServerTime>2018-02-24T14:49:08.000Z</ServerTime>
</Error>
打开就是这样,就是带时间戳的。
要看需求,这些图片是否公众可访问的。如果是公众可访问,把 oss 的桶设为公开,输出原地址即可,防盗链可以在 oss 设置 referrer 限制。如果需要权限,就使用私有桶,输出网站本身的某个路径,例如 /attachments/:id
,然后在控制器里判断访客是否有权限,有就重定向到私有的 oss 地址。私有桶的方式多一次重定向,不能缓存,性能较差。
我是创建了一个 UploadsController 来存储
def create
@upload = Upload.new(upload_params)
@upload.save
respond_to do |format|
format.json { render :json => { url: @upload.image.url, upload_id: @upload.id } }
end
end
噢了 我设成公共读了。”使用私有桶,输出网站本身的某个路径,例如 /attachments/:id,然后在控制器里判断访客是否有权限”这个在富文本编辑器实现感觉稍微复杂点 是不是要用 sanitizie 然后使用 ajax 实现呢…
def show
@upload = Upload.find(params[:id])
if has_permission?
redirect_to @upload.image.url
else
render_404
end
end
def create
@upload = Upload.new(upload_params)
@upload.save
respond_to do |format|
format.json { render :json => { url: upload_url(upload) } }
end
end