繁体   English   中英

IIS,Helicon Zoo和Django-文件上传站点-无法上传大于2.5MB的文件(批量问题)

[英]IIS, Helicon Zoo, Django - File Upload Site - Unable to upload greater than 2.5MB (Chunk issue)

过去几天来,我一直在为此绞尽脑汁,但对于我的特定问题,找不到太多的帮助方法。 这是我的设置。

Windows 7
IIS 7.5
Helicon Zoo 3.1.98.508
Django 1.6.3
Python 2.7.3

我应该声明我是Django和Helicon Zoo的新手。

发生的事情是,虽然在默认的2.5mb下上传文件似乎没有问题,但对于超出此数量的任何内容,我都无法正确地上传文件。 虽然我确定可以在我的设置文件中提高此限制,但我确实不愿意这样做,因为我可以看到需要上传比我真正希望由内存处理的文件更大的文件。

尝试执行此操作时,我看到的是Helicon Zoo给出的信息不多的错误500,其中包含一些缺少的标头

Worker Status
The process was created
Windows error
The operation completed successfully. (ERROR CODE: 0)
Internal module error
message: HTTP-headers - are expected  
type: ZooException 
file: Jobs\JobFastCgi.cpp 
line: 391 
version: 3.1.98.508 
STDERR
Empty stderr

起初,我以为可能与temp文件夹有关,所以我设置了

FILE_UPLOAD_TEMP_DIR = [os.path.join(BASE_DIR, 'temp')]

在我的设置文件中,但似乎没有任何用处。

然后,我发现了如何启用django日志记录功能,这的确使我大开眼界。 我现在知道错误的来源..但是我不知道我应该怎么做才能解决它。

[29/Apr/2014 11:37:00] ERROR [django.request:226] Internal Server Error: /upload/
Traceback (most recent call last):
  File "E:\mysite\venv\lib\site-packages\django\core\handlers\base.py", line 107, in get_response
    response = middleware_method(request, callback, callback_args, callback_kwargs)
  File "E:\mysite\venv\lib\site-packages\django\middleware\csrf.py", line 170, in process_view
    request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
  File "E:\mysite\venv\lib\site-packages\django\core\handlers\wsgi.py", line 146, in _get_post
    self._load_post_and_files()
  File "E:\mysite\venv\lib\site-packages\django\http\request.py", line 215, in _load_post_and_files
    self._post, self._files = self.parse_file_upload(self.META, data)
  File "E:\mysite\venv\lib\site-packages\django\http\request.py", line 180, in parse_file_upload
    return parser.parse()
  File "E:\mysite\venv\lib\site-packages\django\http\multipartparser.py", line 197, in parse
    charset)
  File "E:\mysite\venv\lib\site-packages\django\core\files\uploadhandler.py", line 135, in new_file
    self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset)
  File "E:\mysite\venv\lib\site-packages\django\core\files\uploadedfile.py", line 61, in __init__
    dir=settings.FILE_UPLOAD_TEMP_DIR)
  File "E:\mysite\venv\lib\site-packages\django\core\files\temp.py", line 27, in __init__
    dir=dir)
  File "C:\python27\lib\tempfile.py", line 300, in mkstemp
    return _mkstemp_inner(dir, prefix, suffix, flags)
  File "C:\python27\lib\tempfile.py", line 235, in _mkstemp_inner
    fd = _os.open(file, flags, 0600)
TypeError: coercing to Unicode: need string or buffer, list found

这是什么意思? 我的数据块是否以某种方式作为列表对象进入,但我没有意识到?

这是我的应用程序代码,因为它是我的主应用程序,所以它包含在我制作的Blog应用程序中,这似乎比创建自己的应用程序要简单。 那是个错误吗?

forms.py

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

views.py

from django.shortcuts import render, render_to_response
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.template import RequestContext, loader
from blog.forms import UploadFileForm
from blog.models import Blog
from blog.uploads import handle_uploaded_file


def index(request):
    latest_blog_list = Blog.objects.order_by('-pub_date')[:5]
    template = loader.get_template('blog/index.html')
    context = RequestContext(request, {
        'latest_blog_list': latest_blog_list,
        })
    return HttpResponse(template.render(context))

def detail(request, blog_id):
    try:
        blog = Blog.objects.get(pk=blog_id)
    except:
        raise Http404
    return render(request, 'blog/detail.html', {'blog': blog})

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            #form.save()
            return HttpResponseRedirect('/upload/')
    else:
        form = UploadFileForm()
    return render_to_response('upload/upload.html', {'form': form}, context_instance=RequestContext(request))

uploads.py

import os

saveDir = 'E:\\uploads\\'

def handle_uploaded_file(f):
    #logging.debug('upload_here')
    if f:
        destination = open(saveDir + f.name, 'wb+')
        for chunk in f.chunks():
            destination.write(chunk)
        destination.close()

应用urls.py

from django.conf.urls import patterns, url
from blog import views

urlpatterns = patterns('',
                       url(r'^$', views.index, name='index'),
                       url(r'^(?P<blog_id>\d+)/$', views.detail, name='detail'),
                       url(r'^upload/$', views.upload_file, name='upload'),
)

项目urls.py

from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'project.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^/?', include('blog.urls', namespace="blog")),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^upload/', include('blog.urls', namespace="upload")),
)

我还要注意,这些大文件的一部分实际上出现在我的上载位置中,但大小不过1兆。 就像过程由于某种原因而在实际完成之前停止一样。 然后,我必须停止并重新启动IIS才能使站点再次运行。

因此,这里有两个不同的问题。 首先,我发现

TypeError: coercing to Unicode: need string or buffer, list found

错误不是由于我的代码发送了对象,而是由于设置

FILE_UPLOAD_TEMP_DIR = [os.path.join(BASE_DIR, 'temp')]

需要改为

FILE_UPLOAD_TEMP_DIR = os.path.join(BASE_DIR, 'temp')

这就是本不应该作为列表发送的内容,这是尝试在django项目设置文件中复制其他字段时发生的简单错误。 我应该注意到DIRS和DIR之间的区别,当然是指单个引用。


其次,解决该问题后错误仍然存​​在。 经过几天的努力后,我试图找到一个IIS设置,该设置可能会将我的上传文件截断为1MB,或者可能是我所忽略的Django设置,甚至测试了一个预构建的应用程序,但仍然碰到了同一堵砖墙,当我阅读Helicon Zoo错误报告的配置变量列表时,终于意识到了这一点……

postBuffer = 1024

之类的...因此,经过一番研究,我发现我可以使用Helicon Zoo web.config内部的环境变量来修改此设置。

POST_BUFFER = "4096"

Viola ..我可以突然上传超过1mb的任何内容...超过4mb的任何内容都会被截断,并且出现错误!

所以我终于找到了问题,但令我惊讶的是,我找不到任何有关此问题的文档。 当然,我不是唯一遇到此问题的人,因为这是默认设置! 我希望我可以完全删除它,因为django可以很好地解决这个问题,所以它甚至是一个限制,我真的不需要Helicon帮我完成。 不幸的是,如果我将该值设置为0,则根本没有上传成功。 因此,现在我将把这个值设置为任意高,只是因为坦率地说它是不需要的,并且对我没有任何帮助。

更新:感谢rukeba的上述评论,他的解决方案是该问题的最终答案,因为Twisted引擎没有此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM