Rails环境下CKEditor上传至S3后无法在编辑器访问问题
解决CKEditor+CarrierWave+S3上传后界面冻结的问题
从你的错误日志和代码细节来看,核心问题是你的Ckeditor::Picture模型调用了url(:content)方法,但对应的CkeditorPictureUploader并没有定义名为content的图片版本,这直接触发了ArgumentError (Version content doesn't exist!)错误,导致CKEditor无法完成上传后的回调逻辑,最终界面冻结。
具体修复方案
方案一:给上传器添加content版本(推荐)
CKEditor的图片上传组件默认期望获取一个用于预览的图片版本,你可以在上传器里定义这个版本,还能顺便做尺寸优化:
class CkeditorPictureUploader < CarrierWave::Uploader::Base include Ckeditor::Backend::CarrierWave include CarrierWave::MiniMagick storage :fog # 添加content版本的定义,尺寸可按需调整 version :content do process resize_to_limit: [800, 800] end def store_dir "uploads/ckeditor/pictures/#{model.id}" end def default_url "/images/fallback/" + [version_name, "default.png"].compact.join('_') end def content_type_blacklist ['application/text', 'application/json'] end def extension_white_list Ckeditor.image_file_types end end
方案二:修改模型方法,跳过版本调用
如果不需要生成图片版本,也可以直接修改Ckeditor::Picture的方法,让它返回原始图片的URL:
class Ckeditor::Picture < Ckeditor::Asset mount_uploader :data, CkeditorPictureUploader, mount_on: :data_file_name def url_content url # 去掉(:content)参数,直接返回原始图片地址 end end
问题根源说明
你提到直接用CarrierWave+S3上传封面图正常,是因为那个流程不需要调用url(:content)这个CKEditor专属的方法;而CKEditor上传图片时,会主动调用url_content来获取预览图地址,由于你的上传器没有对应版本,就抛出了错误,中断了CKEditor的上传流程,最终导致界面冻结。
内容的提问来源于stack exchange,提问作者user8773096
相关产品推荐
相关产品推荐

