您现在的位置是:门户> 编程语言> Python

Django处理文件上传File Uploads的实例
2022-01-26 99人围观 0条评论
简介今天小编就为大家分享一篇Django处理文件上传File Uploads的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    HttpRequest.FILES

    表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data

    
    

    request.FILES中的键来自于表单中的的name值:

    img=request.FILES['image']

    request.FILES中的值均为UploadedFile类文件对象。

    UploadedFile

    UploadedFile是类文件对象,具有以下方法和属性:

    UploadedFile.read()

    读取整个上传文件的数据,文件较大时慎用。

    UploadedFile.multiple_chunks(chunk_size=None)

    判断文件是否足够大,一般为2.5M

    UploadedFile.chunks(chunk_size=None)

    返回一个生成器对象,当multiple_chunks()为True时应该使用这个方法来代替read().

    UploadedFile.name

    上传文件的name。

    UploadedFile.size

    上传文件的大小。

    UploadedFile.content_type

    上传文件时的content_type报头,例如(e.g. text/plain or application/pdf).

    UpladedFile.charset

    编码

    存储文件

    想将上传的文件存储在本地时:

    f=request.FILES['image']
    with open('some/file/name.txt', 'wb+') as destination:
     for chunk in f.chunks():
      destination.write(chunk)

    使用Form处理上传文件

    也可以使用django自带的form来处理上传文件。

    先创建带FileFiled或者ImageFiled的Form:

    # In forms.py...
    from django import forms
     
    class UploadFileForm(forms.Form):
     title = forms.CharField(max_length=50)
     file = forms.FileField()

    用Form处理:

    >>> f =UploadFileFormt(request.POST, request.FILES)

    view函数:

    from django.http import HttpResponseRedirect
    from django.shortcuts import render_to_response
    from .forms import UploadFileForm
     
    def handle_uploaded_file(f):
     with open('some/file/name.txt', 'wb+') as destination:
      for chunk in f.chunks():
       destination.write(chunk)
     
    def upload_file(request):
     if request.method == 'POST':
      form = UploadFileForm(request.POST, request.FILES)
      if form.is_valid():
       handle_uploaded_file(request.FILES['file'])
       return HttpResponseRedirect('/success/url/')
     else:
      form = UploadFileForm()
     return render_to_response('upload.html', {'form': form})

    使用Model处理上传文件

    如果创建了一个带FileField或者ImageField域的Model,需要将上传文件存储到Model的FileFIeld域。

    比如,使用nicEdit文本编辑器时,需要存储上传的文件,建立Model:

    from django.db import models
     
    class NicEditImage(models.Model):
     image = models.ImageField(upload_to='nicedit/%Y/%m/%d')

    创建ModelForm:

    from django import forms
     
    class NicEditImageForm(forms.ModelForm):
     class Meta:
      model = NicEditImage

    view:

    def upload(request):
     if not request.user.is_authenticated():
      json = simplejson.dumps({
       'success': False,
       'errors': {'__all__': 'Authentication required'}})
      return HttpResponse(json, mimetype='application/json')
     form = NicEditImageForm(request.POST or None, request.FILES or None)
     if form.is_valid():
      image = form.save() #保存Form和Model
      json = simplejson.dumps({
       'success': True,
       'upload': {
        'links': {
         'original': image.image.url},
        'image': {
         'width': image.image.width,
         'height': image.image.height}
       }
      })
     else:
      json = simplejson.dumps({
       'success': False, 'errors': form.errors})
     return HttpResponse(json, mimetype='application/json')

    当然也可以手动存储文件到Model的文件域:

    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from .forms import UploadFileForm
    from .models import ModelWithFileField
     
    def upload_file(request):
     if request.method == 'POST':
      form = UploadFileForm(request.POST, request.FILES)
      if form.is_valid():
       instance = ModelWithFileField(file_field=request.FILES['file']) #保存文件到FileField域
       instance.save()
       return HttpResponseRedirect('/success/url/')
     else:
      form = UploadFileForm()
     return render(request, 'upload.html', {'form': form})

    不使用Form处理

    想获得更大自由度时,可以全手动处理。

    from django.db import models
     
    class Car(models.Model):
     name = models.CharField(max_length=255)
     price = models.DecimalField(max_digits=5, decimal_places=2)
     photo = models.ImageField(upload_to='cars')

    Model的FileField有以下属性:

    >>> car = Car.objects.get(name="57 Chevy")
    >>> car.photo
    
    >>> car.photo.name
    u'cars/chevy.jpg'
    >>> car.photo.path
    u'/media/cars/chevy.jpg'
    >>> car.photo.url
    u'http://media.example.com/cars/chevy.jpg'

    Model的FileField是一个File对象,除了具有File对象的各种方法外,还有一个额外的save()方法:

    FieldFile.save(name, content, save=True)

    name为存储名字,content为File或者File子类的实例

    >>> car.photo.save('myphoto.jpg', content, save=False)
    >>> car.save()

    类似于

    >>> car.photo.save('myphoto.jpg', content, save=True)

    手动存储:

    from django.core.files.base import ContentFile
    photo=request.FILES.get('photo','')
    if photo: 
     file_content = ContentFile(photo.read()) #创建File对象
     car.photo.save(photo.name, file_content) #保存文件到car的photo域
     car.save()

    以上这篇Django处理文件上传File Uploads的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

分享:

文章评论

    • wxpython 学习笔记 第一天
    • python文本数据处理学习笔记详解