django image的MultiValueDictKeyError文件上传

时间:2014-07-30 10:38:45

标签: python file-upload django-forms django-views

我花了很多时间试图解决这个问题 - 阅读Django文档,咨询表格但没有得到任何满意的结果。所以请耐心等待我。 我试图从我的html模板上传一个图像文件。 这是我的html表单

<form id="tryOnPageForm" method="POST" enctype="multipart/form-data" action="/dummy/{{frame.slug}}/">
{% csrf_token %}
  <input type="file" name="uploadFromPC" id="uploadFromPC" class="myButton" title="Upload From PC" value= "Upload from PC" onchange="uploadPC()" style="float:left;">
 <input type="submit" id="Submit" class="myButton" value= "Done" style="display:none"><br><br>

 </form>

文件上传正确,我可以在HTML中看到上传的图像文件。

在我的views.py

def upload_image(request, frameslug):

frame= VTryON.objects.get(slug=frameslug)
if request.method == 'POST':
    form = ImageUploadForm(request.POST, request.FILES)
    print "FILES", request.FILES
    if form.is_multipart():
        save_file(request.FILES['image'])
        return HttpResponseRedirect('Successful')
    else:
        return HttpResponse('Invalid image')
else:
    form = ImageUploadForm()
return render_to_response('dummy.html', {'form': form})


def save_file(file, path=''):
    ''' Little helper to save a file
    '''
    filename = file._get_name()
    fd = open('%s/%s' % (MEDIA_ROOT, str(path) + str(filename)), 'wb')
    for chunk in file.chunks():
        fd.write(chunk)
    fd.close()

和我的forms.py

from django import forms
class ImageUploadForm(forms.Form):   
image = forms.ImageField(label='Select a file', help_text='max. 20 megabytes')

当我运行我的代码时,我收到此错误

MultiValueDictKeyError at /dummy/fr1234/

我的view.py中的print语句显示了这个

FILES <MultiValueDict: {u'uploadFromPC': [<InMemoryUploadedFile: model4.jpg (image/jpeg)>]}>

这是追溯

Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Work-Backup\LiClipse Workspace\vTryON_DJango_Integration\vTryON\views.py" in upload_image
  189.             save_file(request.FILES['image'])
File "C:\Python27\lib\site-packages\django\utils\datastructures.py" in __getitem__
  301.             raise MultiValueDictKeyError(repr(key))

Exception Type: MultiValueDictKeyError at /dummy/fr1234/
Exception Value: "'image'"

我知道enctype应该是multipart/form-data,因为我已经在教程中阅读了它。另外,我没有在models.py中使用任何字段来存储上传的图像。相反,我想直接将它保存到thrIA MEDIA_URL位置。可能会出现问题吗? 请帮忙。这让我很长时间了。提前谢谢。

3 个答案:

答案 0 :(得分:7)

我能够解决这个问题(花了很多时间并在朋友的帮助下......)

我认为错误

Exception Type: MultiValueDictKeyError at /dummy/fr1234/ Exception Value: "'image'"

即将到来,因为request.FILES无法从用户输入获取上传的图像,原因是我提供的用户输入文件的名称错误!!

应该是request.FILES['uploadFromPC']而不是request.FILES['image'],因为这是我在HTML中保留的名称。

<input type="file" name="uploadFromPC" id="uploadFromPC" class="myButton" title="Upload From PC" value= "Upload from PC" onchange="uploadPC()" style="float:left;">

这是一个愚蠢的错误,浪费了很多时间来解决它.. :(

..但是,你好,学习。

我希望这可以帮助那些尝试做类似事情的人。虽然,如果有人能在这里向我解释forms.py的用法,我希望如此。 是否可以在没有forms.py的情况下进行用户上传?

答案 1 :(得分:1)

我发现在没有选择文件的情况下提交表单时会发生错误。如果未选择文件,则您input_name image中的u''try。这给出了错误,因为字典没有这样的键 我试图找到exceptMultiValueDictKeyError错误的方法,但在python [

中没有这样的例外

答案 2 :(得分:0)

request.FILES['file1']

引发 multivaluedictkeyerror,所以请检查您是否有 request.FILES 下的文件,如下所示 -

if request.method == "POST" and 'file1' in request.FILES and 'file2' in request.FILES:

不要使用

if request.method == "POST" and request.FILES['file1']:

因为它也会引发错误