template html(模板文件):

<form enctype="multipart/form-data" method="POST" action="/address/upload/">
<input type="file" name="file" />
<br />
<input type="submit" value="上传文件" />
</form>

有如下一个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()

详细点:

def handle_uploaded_file(f):
file_name = "" try:
path = "media/editor" + time.strftime('/%Y/%m/%d/%H/%M/%S/')
if not os.path.exists(path):
os.makedirs(path)
file_name = path + f.name
destination = open(file_name, 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
except Exception, e:
print e return file_name

上传文件保存的位置
保存上传文件前,数据需要存放在某个位置。默认时,当上传文件小于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",)

先尝试装入内存,如不行就存入到临时文件。

上传文件封装方法:

'''文件上传'''
def handle_uploaded_file(f):
file_name = "" try:
path = "media/image" + time.strftime('/%Y/%m/%d/%H/%M/%S/')
if not os.path.exists(path):
os.makedirs(path)
file_name = path + f.name
destination = open(file_name, 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
except Exception, e:
print e return file_name

django上传文件的更多相关文章

  1. (转)django上传文件

    本文转自:http://www.cnblogs.com/linjiqin/p/3731751.html 另:  本文对原文做了适当修改 更为详细的介绍可以参考官方文档. emplate html(模板 ...

  2. 实现简单的django上传文件

    本文用django实现上传文件并保存到指定路径下,没有使用forms和models,步骤如下: 1.在模板中使用form表单,因为这个表单使用于上传文件的,所以method属性必须设置为post,而且 ...

  3. Django上传文件和上传图片(不刷新页面)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Django上传文件的那些参数

    # ################## 默认文件上传配置 ######################## from django.core.files.uploadhandler import M ...

  5. 20-1 django上传文件和项目里上传头像如何查看

    一 普通上传方式 1 views def upload(request): if request.method == "POST": # print(request.POST) # ...

  6. Django上传文件的两种方式

    基于form表单上传文件 HTML <h3>基于form表单的上传文件</h3> <form action="" method="post& ...

  7. 【python】django上传文件

    参考:https://blog.csdn.net/zahuopuboss/article/details/54891917 参考:https://blog.csdn.net/zzg_550413470 ...

  8. Python - Django - 上传文件

    upload.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  9. django 上传文件及反馈信息

    from django.shortcuts import render,HttpResponse from django.views import View from Fiskars.models i ...

随机推荐

  1. HDU 2222 Keywords Search(AC自动机入门)

    题意:给出若干个单词和一段文本,问有多少个单词出现在其中.如果两个单词是相同的,得算两个单词的贡献. 分析:直接就是AC自动机的模板了. 具体见代码: #include <stdio.h> ...

  2. Find the equipment indices

    Here is a simple program test task, it doesn't have very diffcult logic: A zero-indexed array A cons ...

  3. encache学习教程

    http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html

  4. Hosting static website on AWS

    http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html#root-d ...

  5. xUtils框架的使用

    xUtils简介 xUtils 包含了很多实用的android工具,xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有 ...

  6. ELK日志管理之——logstash部署

    1.yum源配置 [root@localhost ~]# cat > /etc/yum.repos.d/logstash.repo <<EOF [logstash-1.5] name ...

  7. coursera 机器学习课程 GraphLab环境准备

    在网上看到coursera有机器学习的课程,正好再学习学习,温固一下,还有很多其他的课程也很好.收费的哟! 手机APP和网站收取的费用有差异,网站上要便宜一下,费用差的挺多的,果断在网站上支付了. 有 ...

  8. 我发现调用boostrap的弹框

    在引用了boostrap.js和boostrap.css之后 本来boostrap是基于jQuery的.但是我们的项目里没有用jQuery,而是用的zepto. 调用boostrap的弹框有两种方式: ...

  9. Jquery点击发送按钮后,按钮文本倒计时

    1.html代码 <input type="number" id="mobileNo" placeholder="请输入手机号" /& ...

  10. 专题:initramfs & dracut

    Initramfs An initramfs (initial ram file system) is used by Linux systems to prepare the system duri ...