谷歌AppEngine,Django和request.FILES

时间:2012-03-07 20:52:20

标签: python html django google-app-engine

情境:将html表单(正确设置了method =“POST”和enctype =“multipart / form-data”属性)提交给服务器,即Google的AppEngine上的Django。它包含一个文件输入,该文件输入被移动(未克隆)到所述表单中并通过iframe提交。对于小文件(~1mb或更少),提交的文件可以在request.FILES字典中找到,并存储在blob中。但是,对于大于1mb的文件,查看request.FILES会返回一个错误,声称在给定的dict中找不到密钥(这是文件输入元素的名称),实际上是request.FILES(和request.POST)dicts是空的。

问题:这是否是由于AppEngine限制(如果有,是否有解决方法?)这是否与Django有某种关联(请注意enctype和方法是否设置正确)?还有其他一些缺失的元素吗?

其他信息:还请注意我是一名javascript程序员,正在填写缺席的Python程序员,并且只知道基础知识。请相应地定制您的答案。

相关Python:

def media_image_upload(request):
   if request.method == 'POST':
      img = request.FILES['img']

相关的html:

<form id="hiddenUpForm" style="display:none;" action="http://localhost:8080/media/imageUpload" enctype="multipart/form-data" target="upTarget" method="POST">
  <input name="img" id="img" type="file" accept="image/*">
  <iframe id="upTarget" name="upTarget" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>

1 个答案:

答案 0 :(得分:2)

我认为,为了上传大于1 MB的文件,您需要使用Blobstore API创建用于上传的特殊URL;它不能是您的常规&lt; 1 MB URL。

生成包含上传表单的HTML页面的控制器代码将使用upload_url = blobstore.create_upload_url('media/imageUploadBig'),然后将upload_url添加到模板值并呈现模板。

反过来,模板将包含这样的FORM定义:

<form id="hiddenUpForm" style="display:none;" action="{{ upload_url|safe }}" enctype="multipart/form-data" target="upTarget" method="POST">

这意味着您需要有两种不同的表单 - 一种用于小于1 MB的文件,另一种用于较大的文件 - 或者您可以将所有图像存储在Blobstore中。

有关详细信息,请参阅Blobstore docs