在django中处理图像上载表单:何时使用save()vs chunks()vs cleaned_data?

在django中处理图像上载表单:何时使用save()vs chunks()vs cleaned_data?,django,django-forms,image-uploading,image-upload,Django,Django Forms,Image Uploading,Image Upload,我已使用以下代码成功上载图像: views.py from django.conf.urls.defaults import * from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response from django import template from django.template import RequestContext from m

我已使用以下代码成功上载图像:

views.py

from django.conf.urls.defaults import *
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django import template
from django.template import RequestContext

from mysite.uploadr.forms import UploadFileForm

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            form.handle_uploaded_file(request.FILES['file'])
            return HttpResponse(template.Template('''
                        <html><head><title>Uploaded</title></head> <body>
                        <h1>Uploaded</h1>
                        </body></html>
                        '''
                        ).render( template.Context({}))
                    )
    else:  
        form = UploadFileForm()
    return render_to_response('upload.html', {'form': form}, context_instance=RequestContext(request))
我想更进一步,将图像与正在上载的用户相关联。我在这篇文章中看到了一些例子,并喜欢上了这种技巧:


我注意到他们的代码使用save()和清除的数据。是否不需要像文档中的示例那样迭代块并写入目标文件夹?我必须使用已清理的数据吗?我只是想找出上传文件最有效的方法,我见过很多不同的方法。非常感谢您的帮助。

当文件大于
设置时,需要进行分块。文件\u上载\u最大内存\u大小
(django 1.2中的默认值为2.5M)

看看课堂。它的save()方法为您执行分块保存任务,并执行正确的文件锁定

storage = FileSystemStorage(
                    location = '/var/www/site/upfiles', 
                    base_url = '/upfiles'
                  )


content = request.FILES['the_file']
name = storage.save(None, content) #you can use some suggested name instead of
                                   #None. content.name will be used with None
url = storage.url(name)   #<-- get url for the saved file
storage=FileSystemStorage(
位置='/var/www/site/upfiles',
基本url='/upfiles'
)
content=request.FILES['the_file']
名称=存储。保存(无,内容)#您可以使用一些建议的名称,而不是
#没有。content.name将与None一起使用

url=storage.url(name)#通过直接访问
request.FILES['file']
,您可以绕过UploadFileForm正在进行的任何处理(您甚至不需要表单类来处理这样的文件)
form.cleaned_data['file']
将访问已处理(如果添加了clean方法,则已清理)的表单数据。您还可以访问
请求。直接发布
字典,而不是表单数据。除非您有充分的理由这样做,否则最好使用清理后的表单数据

在您给出的示例中,还使用了一个模型(这是save()方法的调用对象),处理文件访问的是模型的字段。如果你想将上传文件的信息保存到数据库中,那就是最好的方法

您可以使用内置的文件存储API保存文件:

另外,使用用户指定的文件名简单地调用
open(MEDIA_ROOT+'/images/'+file.name,'wb+')
也不是一个好主意。这只是要求目录遍历或其他问题

storage = FileSystemStorage(
                    location = '/var/www/site/upfiles', 
                    base_url = '/upfiles'
                  )


content = request.FILES['the_file']
name = storage.save(None, content) #you can use some suggested name instead of
                                   #None. content.name will be used with None
url = storage.url(name)   #<-- get url for the saved file