IIS,赫利动物园,Django的 - 文件上传网站 - 无法超过2.5MB上传更大(组块问题)(I

2019-10-20 00:49发布

现在我已经令人头大我的大脑在这最后几天,一直没能找到的帮助的方式,我的具体问题。 这里是我的设置。

Windows 7
IIS 7.5
Helicon Zoo 3.1.98.508
Django 1.6.3
Python 2.7.3

我要声明,我是新来的Django和赫利动物园。

发生了什么事是,虽然我似乎没有问题,上传2.5MB的默认下的文件,我不能让大块正确上传任何超过这一数额。 虽然我敢肯定,我可以在我的设置文件这个限制,我真的不想因为我的目的,我可以看到需要上传更大的文件比我真想被存储处理。

我所看到的,当我从赫利动物园尝试这是一个相当无信息错误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

起初,我想也许这是什么做的临时文件夹,所以我设置

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让现场甚至再次功能。

Answer 1:

所以有几个不同的问题在这里。 首先,我发现,

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的设置,我俯瞰,甚至测试预置的应用程序的一两天,才仍然击中同一砖墙,它通过配置变量的赫利动物园错误报告的列表读取时终于明白了我,使我发现了一些...

postBuffer = 1024

的......儿子这么一个小小的研究,我发现我可以用我的赫利动物园的web.config的内部环境变量修改这个设置之后。

POST_BUFFER = "4096"

中提琴。我可以在大小上载突然任何超过1MB ......任何超过4MB被截断,我得到一个错误!

所以,我终于找到了问题,但它完全令人吃惊,我认为我无法找到关于该作为的问题任何类型的文档。 当然,我不是唯一的人碰到过这样的,其作为它的默认设置! 我希望我能完全删除,因为即使是一个限制,因为Django的处理这个问题就好了本身,我真的不需要做赫利为我。 不幸的是,它看起来像如果我的值设置为0,则没有上传会在所有的工作。 所以现在我要将该值设置为任意的东西只是高因为坦率地说这是没有必要的,不帮我以任何方式。

更新:感谢rukeba的上述评论,他的解决办法是最后的答案,这个问题的扭曲引擎不存在这个问题。



文章来源: IIS, Helicon Zoo, Django - File Upload Site - Unable to upload greater than 2.5MB (Chunk issue)