当前位置:脚本大全 > > 正文

django用户上传文件怎么接收(Django框架文件上传与自定义图片上传路径、上传文件名操作分析)

时间:2021-10-03 01:18:24类别:脚本大全

django用户上传文件怎么接收

Django框架文件上传与自定义图片上传路径、上传文件名操作分析

本文实例讲述了django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下:

文件上传

1、创建上传文件夹

在static文件夹下创建uploads用于存储接收上传的文件

在settings中配置,

  • ?
  • 1
  • media_root=os.path.join(base_dir,r'static/uploads')
  • 2、定义上传表单

  • ?
  • 1
  • 2
  • <form action="{% url 'app:do_upload' %}"
  • method="post" enctype="multipart/form-data">
  • 文件数据存储在request.files属性中

    文件上传必须使用post请求方式

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • <form method='post' action='x' enctype='multipart/form-data'>
  •  {% csrf_token %}
  •  <input type='file' name='icon'>
  •  <input type='submit' value='上传'>
  • <form>
  • 3、手动存储文件

    存储到关联用户的表字段中

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • def saveficon(request):
  • if request.method == 'post'
  •  f = request.files['icon']
  •  filepath = os.path.join(settings.media_root,f.name)
  •  with open(filepath,'wb') as fp:
  •   for part in f.chunks():
  •    fp.write(part)
  • 4、django内置存储

    自定义图片上传路径和上传文件名

    图片上传中,如果不对上传的文件名做处理,很容易引起文件名重复,这会覆盖之前上传的图片,django提供了自定义上传文件名的方法。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • def generate_filename(self, instance, filename):
  •  """
  •  apply (if callable) or prepend (if a string) upload_to to the filename,
  •  then delegate further processing of the name to the storage backend.
  •  until the storage layer, all file paths are expected to be unix style
  •  (with forward slashes).
  •  """
  •  if callable(self.upload_to):
  •   filename = self.upload_to(instance, filename)
  •  else:
  •   dirname = datetime.datetime.now().strftime(self.upload_to)
  •   filename = posixpath.join(dirname, filename)
  •  return self.storage.generate_filename(filename)
  • 上面的代码是django中对imagefield上传时,生成文件名的处理方式。如果 upload_to 的参数是可调用的,则直接调用来生成文件名(包括静态文件夹后的文件路径)。要自定义上传文件名就从这里着手。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • import uuid
  • from django.db import models
  • def image_upload_to(instance, filename):
  •  return 'original_image/{uuid}/{filename}'.format(uuid=uuid.uuid4().hex, filename=filename)
  • class testimageupload(models.model):
  •  image = models.imagefield(upload_to=image_upload_to)
  • 按照上面的方式,就可以按照自己的意愿随意的处理文件名了(函数的参数个数是固定的)。

    希望本文所述对大家基于django框架的python程序设计有所帮助。

    上一篇下一篇

    猜您喜欢

    热门推荐