博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django上传文件
阅读量:4622 次
发布时间:2019-06-09

本文共 2959 字,大约阅读时间需要 9 分钟。

template html(模板文件):

 

有如下一个form:

from django import formsclass 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 HttpResponseRedirectfrom django.shortcuts import render_to_responsefrom somewhere import handle_uploader_filedef 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

转载于:https://www.cnblogs.com/sweet521/p/5634012.html

你可能感兴趣的文章
C语言学习笔记--字符串
查看>>
关于七牛进行图片添加文字水印操作小计
查看>>
DataSource数据库的使用
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>
Java的内部类真的那么难以理解?
查看>>
一文搞懂Java环境,轻松实现Hello World!
查看>>
hash实现锚点平滑滚动定位
查看>>
也谈智能手机游戏开发中的分辨率自适应问题
查看>>
关于 IOS 发布的点点滴滴记录(一)
查看>>
《EMCAScript6入门》读书笔记——14.Promise对象
查看>>
CSS——水平/垂直居中
查看>>
Eclipse连接mysql数据库jdbc下载(图文)
查看>>
Python中Selenium的使用方法
查看>>
三月23日测试Fiddler
查看>>
20171013_数据库新环境后期操作
查看>>
SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
查看>>
Socket & TCP &HTTP
查看>>
osip及eXosip的编译方法
查看>>
Hibernate composite key
查看>>
[CF Round #294 div2] D. A and B and Interesting Substrings 【Map】
查看>>