django上传文件

template html(模板文件):
<form enctype="multipart/form-data" method="POST" action="/address/upload/">
<input type="file" name="file" /><br/>
<input type="submit" value="上传文件" />

有如下一个form:
from django import forms
class UploadFileForm(forms.Form):
  title = forms.CharField(max_length=50)
  file = forms.FileField()
处 理这个form的视图收到了在request.FILES中的文件数据。从上述form来的数据可能通过request.FILES['file']来存 取。特别注意的是,只有当request方法是POST,且发送request的<form>有属性 enctype="multipart/form-data"时,request.FILES中包含文件数据,否则request.FILES为空。
以下视图函数:
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from somewhere import handle_uploader_file
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})
必须要将request.FILES传给form的构造函数,才能将文件数据绑定到form.
处理上传文件
字典request.FILES中的每一个条目都是一个UploadFile对象。UploadFile对象有如下方法:
1、UploadFile.read():
  从文件中读取全部上传数据。当上传文件过大时,可能会耗尽内存,慎用。
2、UploadFile.multiple_chunks():
  如上传文件足够大,要分成多个部分读入时,返回True.默认情况,当上传文件大于2.5M时,返回True。但这一个值可以配置。
3、UploadFile.chunks():
  返回一个上传文件的分块生成器。如multiple_chunks()返回True,必须在循环中使用chrunks()来代替read()。一般情况下直接使用chunks()就行。
4、UploadFile.name():上传文件的文件名
5、UplaodFile.size():上传文件的文件大小(字节)
由上面的说明可以写出handle_uploaded_file函数
def handle_uploaded_file(f):
  destination = open('some/file/name.txt', 'wb+')
  for chunk in f.chunks():
    destination.write(chunk)
  destination.close()
上传文件保存的位置
保存上传文件前,数据需要存放在某个位置。默认时,当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。意味着保存文件只有一次从内存读取,一次写磁盘。
但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
改变upload handler的行为
三个设置控制django文件上传的行为:
FILE_UPLOAD_MAX_MEMORY_SIZE:直接读入内存的最大上传文件大小(字节数)。当大于此值时,文件存放到磁盘。默认2.5M字节
FILE_UPLOAD_TEMP_DIR
FILE_UPLOAD_PERMISSIONS:权限
FILE_UPLOAD_HANDLERS
上传文件真正的处理器。修改此项设置可以完成自定义django上传文件的过程。
默认是:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
 "django.core.files.uploadhandler.TemporaryFileUploadHandler",)
先尝试装入内存,如不行就存入到临时文件。



在我写的教程中的第八讲就有关于通讯录的上传处理,不过那时处理很简单。

首先是 form 要写正确,格式为:

<form enctype="multipart/form-data" method="POST" action="/address/upload/">

文件上传的input field的写法为:

<input type="file" name="file"/>

后台的处理是使用 request.FILES。它是一个Dict值,你可以:

file_obj = request.FILES.get(‘file’, None)

这里的’file’是与input field的名字一致的。如果file_obj不为空,它将是一个字典,通过测试可以得知它都有什么值。如果你参考 django 自带的 request_response.txt 文档,可以看到它主要有三个值:

  • content
    这是文件的内容
  • filename
    这是原文件名
  • content-type
    这是文件的mime类型

那么它放在哪里呢?应该是在内存中。因此接下来你可以对这个文件的内容进行处理了,是直接处理内容或保存到一个地方。

也许有人会问,那么 settings.py 中的 MEDIA_ROOT 是做什么用的。如果你不使用 django 的 Model 中的 FileField 或 ImageField 的话,它其实没有什么用。这个设置是用在 Model 的 FileField 中的。在创建一个 Model 时,如果你的 Model 中有与文件相关的字段,那么 django 会根据每个文件字段生成一系列的方法,如:get_fieldname_filename() get_fieldname_url() save_fieldname_file()。fieldname是根据你在 Model 中所起的名字来的。而 save_fieldname_file 需要两个参数,一个是文件名,另一个就是文件内容。因此,你可以使用这个方法来将上传的文件保存。那么保存到哪里去了呢?就是 MEDIA_ROOT 这个目录下。而 settings.py 中的 MEDIA_URL 就是用于 get_fieldname_url() 这个方法的。

因此,MEDIA_ROOT 只与 Model 有关。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值