Rails 有人用过富文本编辑器 summernote 吗?

maxchen · 2018年02月24日 · 最后由 maxchen 回复于 2018年02月25日 · 2044 次阅读

我用的富文本编辑器是 summernote,对应的 gem 是这个:

https://github.com/summernote/summernote-rails

图片存储服务用的是阿里云的 oss,刚开始都没问题,文章编辑完发布后能正常显示,但过了差不多一个小时,重新打开文章发现图片都不能正常显示,请问是什么问题呢?

是不是 oss 设置了私有桶,返回的是带时间戳签名的私有地址。

Rei 回复

好像是的。

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
这个就是上一张要在富文本中使用的图片,这个地址就是显示在我的网页中的,不能显示

请问该怎么处理呢?

maxchen 回复
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 地址。私有桶的方式多一次重定向,不能缓存,性能较差。

Rei 回复

不太理解,富文本编辑器中添加的图片地址不是已经固定生成好的吗?怎么重定向呢?

maxchen 回复

这又要区分编辑器是直传云储存还是经服务器中转,看你描述是直传云储存,那只能用公开桶了。

我是创建了一个 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
maxchen 回复

那么这时候返回的 URL 可以是自己的链接而不是 oss 链接。

Rei 回复

但就是出现了帖子上的问题,请问该怎么解决呢?

maxchen 回复

看第四楼

Rei 回复

噢了 我设成公共读了。” 使用私有桶,输出网站本身的某个路径,例如 /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
Rei 回复

搞定!Thank you😄

maxchen 关闭了讨论。 02月27日 08:07
需要 登录 后方可回复, 如果你还没有账号请 注册新账号