Django框架文件上传与自定义图片上传路径、上传文件名操作分析
本文实例讲述了Django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下:
文件上传
1、创建上传文件夹
在static文件夹下创建uploads用于存储接收上传的文件
在settings中配置,
MEDIA_ROOT=os.path.join(BASE_DIR,r'static/uploads')
2、定义上传表单
文件数据存储在request.FILES属性中
文件上传必须使用POST请求方式
{%csrf_token%}
3、手动存储文件
存储到关联用户的表字段中
defsavefIcon(request): ifrequest.method=='POST' f=request.FILES['icon'] filePath=os.path.join(settings.MEDIA_ROOT,f.name) withopen(filePath,'wb')asfp: forpartinf.chunks(): fp.write(part)
4、django内置存储
- ImageField
- 要导入pillow模块
- FileField
- 从request.FILES将文件获取出来,直接赋值给字段
- 存储的时候,数据库存储的是路径
- 存储在MEDIA_ROOT
自定义图片上传路径和上传文件名
图片上传中,如果不对上传的文件名做处理,很容易引起文件名重复,这会覆盖之前上传的图片,django提供了自定义上传文件名的方法。
defgenerate_filename(self,instance,filename): """ Apply(ifcallable)orprepend(ifastring)upload_totothefilename, thendelegatefurtherprocessingofthenametothestoragebackend. Untilthestoragelayer,allfilepathsareexpectedtobeUnixstyle (withforwardslashes). """ ifcallable(self.upload_to): filename=self.upload_to(instance,filename) else: dirname=datetime.datetime.now().strftime(self.upload_to) filename=posixpath.join(dirname,filename) returnself.storage.generate_filename(filename)
上面的代码是django中对ImageField上传时,生成文件名的处理方式。如果upload_to的参数是可调用的,则直接调用来生成文件名(包括静态文件夹后的文件路径)。要自定义上传文件名就从这里着手。
importuuid fromdjango.dbimportmodels defimage_upload_to(instance,filename): return'original_image/{uuid}/{filename}'.format(uuid=uuid.uuid4().hex,filename=filename) classTestImageUpload(models.Model): image=models.ImageField(upload_to=image_upload_to)
按照上面的方式,就可以按照自己的意愿随意的处理文件名了(函数的参数个数是固定的)。
希望本文所述对大家基于Django框架的Python程序设计有所帮助。