与django-tinymce集成S3上传/浏览



我一直在寻找有关如何将Amazon S3与TinyMCE集成的资源。目前我想到的最好的链接是:http://forums.aurigma.com/yaf_postst4033_Amazon-S3-File-Manager-for-TinyMCE-and-CKEditor.aspx

有没有人有经验把它集成到Django应用中?如果没有,那么有哪些富文本编辑和从S3导入图像的替代解决方案呢?

如果有人最近像我一样搜索过这个,并且需要一个解决方案来让django-tinymce4-lite与django-storage和django-filebrowser-no-grappelli一起工作,我已经设法通过以下方式让它工作:

1)遵循这个优秀的教程:https://karansthr.gitlab.io/fosstack/how-to-set-up-tinymce-in-django-app/

2)当涉及到s3部分的工作,你需要安装django-storage和设置你的mediastorages在这里的说明

3)您需要创建S3Boto3Storage的子类,并使其成为您的DEFAULT_FILE_STORAGE,如下所示:

DEFAULT_FILE_STORAGE = 'path.to.module.MediaStorage'

4)并在该模块中创建MediaStorage类,使用以下API与FileBrowser

一起工作
class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION
    isfilecached = {}
    def isdir(self, name):
        if not name:  # Empty name is a directory
            return True
        if self.isfile(name):
            return False
        return True
    def isfile(self, name):
        if len(name.split('.')) > 1:
            return True
        try:
            name = self._normalize_name(self._clean_name(name))
            if self.isfilecached.get(name) is not None:
                return self.isfilecached.get(name)
            f = S3Boto3StorageFile(name, 'rb', self)
            if "directory" in f.obj.content_type:
                isfile = False
            else:
                isfile = True
        except Exception:
            isfile = False
        self.isfilecached[name] = isfile
        return isfile
    def move(self, old_file_name, new_file_name, allow_overwrite=False):
        if self.exists(new_file_name):
            if allow_overwrite:
                self.delete(new_file_name)
            else:
                raise "The destination file '%s' exists and allow_overwrite is False" % new_file_name
        old_key_name = self._encode_name(self._normalize_name(self._clean_name(old_file_name)))
        new_key_name = self._encode_name(self._normalize_name(self._clean_name(new_file_name)))
        k = self.bucket.meta.client.copy(
            {
                'Bucket': self.bucket.name,
                'Key': new_key_name
            },
            self.bucket.name,
            old_key_name
        )
        if not k:
            raise "Couldn't copy '%s' to '%s'" % (old_file_name, new_file_name)
        self.delete(old_file_name)
    def makedirs(self, name):
        name = self._normalize_name(self._clean_name(name))
        return self.bucket.meta.client.put_object(Bucket=self.bucket.name, Key=f'{name}/')
    def rmtree(self, name):
        name = self._normalize_name(self._clean_name(name))
        delete_objects = [{'Key': f"{name}/"}]
        dirlist = self.listdir(self._encode_name(name))
        for item in dirlist:
            for obj in item:
                obj_name = f"{name}/{obj}"
                if self.isdir(obj_name):
                    obj_name = f"{obj_name}/"
                delete_objects.append({'Key': obj_name})
        self.bucket.delete_objects(Delete={'Objects': delete_objects})
    def path(self, name):
        return name
    def listdir(self, name):
        directories, files = super().listdir(name)
        if '.' in files:
            files.remove('.')
        return directories, files
    def exists(self, name):
        if self.isdir(name):
            return True
        else:
            return super().exists(name)
    def get_modified_time(self, name):
        try:
            # S3 boto3 library requires that directorys have the trailing slash
            if self.isdir(name):
                name = f'{name}/'
            modified_date = super().get_modified_time(name)
        except Exception:
            modified_date = timezone.now()
        return modified_date
    def size(self, name):
        try:
            # S3 boto3 library requires that directorys have the trailing slash
            if self.isdir(name):
                name = f'{name}/'
            size = super().size(name)
        except Exception:
            size = 0
        return size
5)确保把这些放在你的Django设置中:
MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'path.to.module.MediaStorage'
FILEBROWSER_DEFAULT_PERMISSIONS = None
FILEBROWSER_LIST_PER_PAGE = 5  # Speeds up the load of the filebrowser files
AWS_PRELOAD_METADATA = True     # Speeds up the load of the filebrowser files
AWS_QUERYSTRING_AUTH = False    # Speeds up the load of the filebrowser files

希望能有所帮助

我最终使用了django-storage。完美的工作。

最新更新