我一直在寻找有关如何将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。完美的工作。