1.介绍
在Django开发中,使用Ueditor作为编辑器时,我们需要将上传文件自定义文件名存储到服务器上,以便后续的查询和使用。本文将重点介绍如何使用Django和Ueditor自定义存储上传文件的文件名。Ueditor是一个基于javascript的所见即所得富文本编辑器,功能齐全,易于扩展,可以轻松集成到Django中实现自定义文件名的存储。在本文中我们将使用Django 2.0和Ueditor 1.4.3.3。
1.1 配置存储后端
在Django中,要使用自定义文件名存储上传文件,需要配置存储后端。Django自带有几种可用的存储后端,包括本地文件系统存储和云存储。本文中我们将使用Amazon S3存储来演示自定义文件名的存储方式。在使用Amazon S3存储时,我们需要安装一些必要的库:
pip install django-storages boto3
Django Storages是一个Django开源项目,提供了一组基于Amazon S3等云存储的文件管理后端。
1.2 Ueditor配置
在使用Ueditor时,需要对其进行一些配置,以便我们自定义文件名的存储方式。在本文中,我们将使用ajax提交方式上传文件管理器,并设置上传URL。
2.配置
接下来,我们将详细介绍如何配置Django和Ueditor以实现自定义文件名存储。
2.1 配置存储后端
首先,在Django项目的settings.py文件中,我们需要添加Amazon S3相关的配置项:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = 'Your AWS Access Key'
AWS_SECRET_ACCESS_KEY = 'Your AWS Secret Key'
AWS_STORAGE_BUCKET_NAME = 'Your AWS Bucket Name'
AWS_S3_REGION_NAME = 'Your AWS Region Name'
AWS_S3_CUSTOM_DOMAIN = 'Your Custom Domain Name'
以上代码中,我们首先配置了默认的文件存储方式为S3Boto3Storage,然后分别填入了我们的AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_STORAGE_BUCKET_NAME,AWS_S3_REGION_NAME和AWS_S3_CUSTOM_DOMAIN等参数。这些参数需要在Amazon账户中创建时分配。最后,由于我们可能会使用自定义域名和S3存储桶一起使用,因此我们也需要配置AWS_S3_CUSTOM_DOMAIN参数。
2.2 配置Ueditor
第二步是在Ueditor中配置文件上传相关的参数,我们将在ueditor.cofing.js文件中进行配置。具体如下:
{
...
serverUrl: "", ///ueditor/controller.php
autoHeightEnabled:false,
autoFloatEnabled:false,
fileUrl: '/ueditor/php/controller.php?action=uploadfile',
fileFieldName: 'upfile',
fileMaxSize: 2048 * 2048,
imageActionName: "uploadimage",
imageFieldName: "upfile",
imageUrl: "/ueditor/php/controller.php?action=uploadimage",
imageMaxSize: 2048 * 2048,
videoFieldName: 'upfile',
videoUrl: '/ueditor/php/controller.php?action=uploadvideo',
videoMaxSize: 1024 * 1024 * 10,
fileActionName: "uploadfile",
fileFieldName: "upfile",
fileUrl: "/ueditor/php/controller.php?action=uploadfile",
fileMaxSize: 8192 * 8192,
catcherUrl: "/ueditor/php/controller.php?action=catchimage",
catcherFieldName: "source",
catcherActionName: "catchimage",
catcherPathFormat: "",
imageManagerUrl: "/ueditor/php/controller.php?action=listimage",
imageManagerFieldName: "imgUrl",
imageManagerActionName: "listimage",
imageManagerListPath: "/ueditor/php/upload/image/",
imageManagerListSize: 20,
imageManagerUrlPrefix: "",
fileManagerUrl: "/ueditor/php/controller.php?action=listfile",
fileManagerFieldName: "fileUrl",
fileManagerActionName: "listfile",
fileManagerListPath: "/ueditor/php/upload/file/",
fileManagerUrlPrefix: ""
}
在以上代码中,我们将文件上传的URL设置为自定义的的URL,通过控制器完成文件上传,并设置图像和文件上传的最大大小,在文件上传控制器中,我们可以通过使用unique_name指定文件名。其中,unique_name可以是一个自定义的方法。
3.自定义文件名
在Django中,我们可以通过指定文件存储后端的方式来自定义文件名。本文中,我们将使用一个简单的随机字符串作为文件名,以确保文件名的唯一性。
3.1 生成随机字符串
生成随机字符串是用来作为自定义文件名的一种方式。我们可以使用python内置库string和random中的函数来生成随机字符串。
import random
import string
def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
上述代码中,通过random.choice(chars)的方式从指定的字符集,生成指定大小的随机字符串。
3.2 自定义存储文件名
在存储上传文件时,我们可以在上传前生成随机的文件名,并将存储后端设置的filename生成器指定为自定义代码。下面是一个自定义存储文件名的示例:
from django.core.files.storage import FileSystemStorage
from django.utils.deconstruct import deconstructible
@deconstructible
class CustomStorage(FileSystemStorage):
def __init__(self, location=None, base_url=None, *args, **kwargs):
super().__init__(location=location, base_url=base_url, *args, **kwargs)
def get_avail_name(self, name):
while self.exists(name):
name = self.generate_filename(name)
return name
def generate_filename(self, filename):
ext = filename.split('.')[-1]
filename = random_string_generator() + '.' + ext
return super().generate_filename(filename)
在上述代码中,我们定义了一个名为CustomStorage的存储后端,并重写了父类中的generate_filename方法。这个方法将使用我们上面定义的随机字符串生成器来生成一个随机的文件名。
3.3 使用自定义存储后端
在settings.py中,我们可以使用刚才定义的CustomStorage来实现自定义存储:
DEFAULT_FILE_STORAGE = 'path.to.CustomStorage'
4.总结
本文介绍了如何使用Django和Ueditor实现自定义文件名的方式。通过修改存储后端和配置ueditor.config.js文件,我们可以在文件上传时使用自定义的文件名。这种方法可用于许多应用程序,如存储视频,音乐和图片等文档和媒体内容。