django上传文件

Posted Mr.风的影子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django上传文件相关的知识,希望对你有一定的参考价值。

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 中上传文件? [关闭]

Alamofire 文件上传出现错误“JSON 文本未以数组或对象开头,并且允许未设置片段的选项”

django项目中.gitignore文件忽略上传的文件,以及数据库迁移文件到底是否需要上传吗?

Django 文件上传返回无

Django modelForm 中的文件上传

如何在 Django Summernote 中显示编程片段的代码块?