我花了很多时间试图解决这个问题 - 阅读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位置。可能会出现问题吗?
请帮忙。这让我很长时间了。提前谢谢。
答案 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
。这给出了错误,因为字典没有这样的键
我试图找到except
和MultiValueDictKeyError
错误的方法,但在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']:
因为它也会引发错误