django上传文件
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上传文件的更多相关文章
- (转)django上传文件
本文转自:http://www.cnblogs.com/linjiqin/p/3731751.html 另: 本文对原文做了适当修改 更为详细的介绍可以参考官方文档. emplate html(模板 ...
- 实现简单的django上传文件
本文用django实现上传文件并保存到指定路径下,没有使用forms和models,步骤如下: 1.在模板中使用form表单,因为这个表单使用于上传文件的,所以method属性必须设置为post,而且 ...
- Django上传文件和上传图片(不刷新页面)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Django上传文件的那些参数
# ################## 默认文件上传配置 ######################## from django.core.files.uploadhandler import M ...
- 20-1 django上传文件和项目里上传头像如何查看
一 普通上传方式 1 views def upload(request): if request.method == "POST": # print(request.POST) # ...
- Django上传文件的两种方式
基于form表单上传文件 HTML <h3>基于form表单的上传文件</h3> <form action="" method="post& ...
- 【python】django上传文件
参考:https://blog.csdn.net/zahuopuboss/article/details/54891917 参考:https://blog.csdn.net/zzg_550413470 ...
- Python - Django - 上传文件
upload.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- django 上传文件及反馈信息
from django.shortcuts import render,HttpResponse from django.views import View from Fiskars.models i ...
随机推荐
- WebService 基础使用&cxf第三方Service使用
1.通过Jax-ws自己发布一个webservice 解析:用webservice发布HelloWorld JAX-WS本质就是通过Socket来实现的.2.WSDL文档描述如何直接变成java代码 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (引用) unittest测试驱动之执行测试(三)
转载:http://www.wtoutiao.com/p/ydeoyY.html 在unittest的模块中,提供了TestRunner类来进行运行测试用例,在实际的应用中,经常使用的是TextTes ...
- [DB]MariaDB 与 MySql 数据库
目前 MariaDB 已经出来几年了,本文编辑时的官网最新稳定版本是 10.1.14 链接:https://downloads.mariadb.org/ 但百度没有下载,搜狗给的下载版本是 5.5.2 ...
- python学习笔记-Day6(2)
xml处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...
- Odoo下拉动作列表
- 获取wifi信息
最近有个项目需要获取手机附近wifi列表,查了许多资料发现,现在只能查到wifi的SSID,并且用到的是私有api,无法通过app store审核,这里记录一下,方便学习,新手勿喷,欢迎大神指教(wi ...
- 关于java中线程休眠的另一种写法
编辑器加载中... 优先使用TimeUnit类中的sleep() TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的 ...
- php array转json、xml
class Encode{ public static function jsonEncode($code,$message,$data){ $result = array( 'code' => ...
- hdu 1231
最大连续子序列 Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Statu ...