记在django中用ckeditor上传文件到阿里云oss的一些坑

用的是django-aliyun-oss2-storage,这个库在linux下可以直接用pip安装

win下要下载源码 https://github.com/xiewenya/django-aliyun-oss2-storage

下载后在虚拟环境下安装,安装前要先把README.md的内容清空并保存为ANSI格式,默认的utf-8编码会报错

python setup.py install

安装好后在settings.py里设置

    ACCESS_KEY_ID = "xxxx"

    ACCESS_KEY_SECRET = "xxxx"

    END_POINT = "https://oss-cn-beijing.aliyuncs.com"

    BUCKET_NAME = "xxx"

    ALIYUN_OSS_CNAME = ""  # 自定义域名,如果不需要可以不填写

    BUCKET_ACL_TYPE = "public-read"  # private, public-read, public-read-write

    DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage'

    MEDIA_URL = '/media/'

    MEDIA_ROOT = "media"

这样设置好后,去后台传个文件试了一下,确实可以上传,oss里会有上传的文件,但是有报错,而且页面上会跳500错误

调试了一番后发现,ckeditor_upload的views里第94行在保存完图片后会写入一个缩略图,这个地方的地址错了,会少前面的/media/uploads

再往下查发现这个地址是从django-aliyun-oss2-storage/aliyun_oss2_storage/backends.py这个地方的class AliyunFile这个类里__init__时就获取错误了,修改代码

# self._name = name[len(self._storage.location):]   #这个就是错误代码

self._name= self._storage.location[1:]+ name

修改后要重新python setup.py install安装一下,否则无效

这样就可以上传了,但是发现在图像信息界面点浏览服务器按钮后,不能查看已上传图片

继续调试,根源还是在这个aliyun_oss2_storage上,在AliyunBaseStorage类里面有一个listdir这里我自己做了一个测试发现根本获取不到任何文件,但是把delimiter='/'这个参数去掉就可以了,修改代码

# for obj in ObjectIterator(self.bucket, prefix=name, delimiter='/'):

for objin ObjectIterator(self.bucket, prefix=name):

    if obj.is_prefix():

        dirs.add(obj.key)

else:

        # files.append(obj.key)

        files.append(obj.key[len(name)+ 1:])

上面修改了两处代码,说明有两个坑 ,前一个坑就是之前说的,后面那个是要把搜索前缀去掉,像我的搜索前缀(prefix)是media/uploads,否则会后面的代码会在这个基础上再补上这个前缀,这样就会出现 media/uploads/media/uploads,这样就找不到文件,页面不停的菊花,这个坑也是浪费了我很多时间的。

这样改完就可以基本正常使用了

还有一些英文的东西,汉化一下,上传图像那边预览里面会有一些鸟语,去掉的话要在ckeditor/config.js里添加一条

config.image_previewText = ' '; //注意是有空格的,不是空字符

ckeditor_uploader/templates/ckeditor/browse.html这个是点击浏览服务器后出来的界面的模板文件,里面有一些英文的东西汉化

<div class="submit-row">这个标签里面的inputs标签的value改成“插入图片”

页面开头的英文改成

                {% if files %}

                    <h2>选择你想要加入的图片,然后点击 '插入图片'...</h2>

                {% else %}

                    <h2>没有已上传的图片. 你可以在上传标签里选择文件后点上传到服务器.</h2>

                {% endif %}

还有一个search files要在ckeditor_uploader/forms.py里改

class SearchForm(forms.Form):

    q= forms.CharField(label='搜索文件', required=False)

改完后效果


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容