Python IIS,Django Helicon Zoo-文件上载站点-无法上载大于2.5MB的文件(区块问题)

Python IIS,Django Helicon Zoo-文件上载站点-无法上载大于2.5MB的文件(区块问题),python,django,iis,file-upload,heliconzoo,Python,Django,Iis,File Upload,Heliconzoo,在过去的几天里,我一直在为这个问题绞尽脑汁,但对于我的具体问题,却没有找到多少帮助。这是我的设置 Windows 7 IIS 7.5 Helicon Zoo 3.1.98.508 Django 1.6.3 Python 2.7.3 我应该说我是Django和Helicon动物园的新手 所发生的事情是,虽然我在默认的2.5mb下上传文件似乎没有问题,但对于超过这个数量的任何内容,我都无法获得正确上传的块。虽然我确信我可以在我的设置文件中达到这个限制,但我真的不希望因为我的目的而需要上传比我真正希

在过去的几天里,我一直在为这个问题绞尽脑汁,但对于我的具体问题,却没有找到多少帮助。这是我的设置

Windows 7
IIS 7.5
Helicon Zoo 3.1.98.508
Django 1.6.3
Python 2.7.3
我应该说我是Django和Helicon动物园的新手

所发生的事情是,虽然我在默认的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
起初,我想可能是临时文件夹的问题,所以我设置了

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
这是什么意思?我的块是否以列表对象的形式出现,但我没有意识到

这是我的应用程序代码,它包含在我制作的博客应用程序中,因为它是我的主应用程序,似乎比创建一个完全属于自己的应用程序要简单。那是个错误吗

forms.py

views.py

uploads.py

app url.py


我还应该注意,这些大文件的一部分实际上出现在我的上传位置,但大小不超过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"
中提琴。。我可以突然上传任何超过1mb大小的东西。。。任何超过4mb的内容都会被截断,我会得到一个错误

所以我最终发现了这个问题,但我完全惊讶于我找不到任何关于这个问题的文档。当然,我不是唯一一个遇到这种情况的人,因为这是默认设置!我希望我能把它完全去掉,因为django自己处理的很好,我真的不需要Helicon帮我做。不幸的是,如果我将该值设置为0,则根本无法进行上传。所以现在我要将这个值设置为任意高的值,因为坦白说,它不需要,也没有任何帮助


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

Robb,我是Helicon Zoo的开发者。我们已经确认了这个问题,现在就开始调查。我会告诉你结果的。谢谢。谢谢rukeba,我能够缩小范围,我的问题似乎主要是关于不能禁用postBuffer。这似乎是限制我上传的原因。如果如文档所述,将其设置为0,则根本无法上载任何内容。我希望这就是你们正在调查的。正如我在下面回答的那样,我最初遇到的错误是通过将文件\u UPLOAD\u TEMP\u DIR正确地建立为字符串而不是列表来解决的。Robb,我建议您现在使用“python.2.7.twisted”引擎。它使用http协议和tcp传输与应用程序通信,不依赖于postBuffer。只需通过WPI安装twisted,切换引擎,在web.config中添加WSGI_APP env变量。哦,哇!这一切都解决了!刚刚测试了一个60mb的上传,它顺利通过了!非常感谢你,鲁克巴!
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')
postBuffer = 1024
POST_BUFFER = "4096"