ファイルをアップロードするためのファイル入力フィールドがあります...ビューファイルは次のようになります...
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from forms import RegisterForm
from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext
from django import forms
from django.contrib.auth import authenticate
from django.contrib import auth
from settings import MEDIA_ROOT
class UploadFileForm(forms.Form):
file = forms.Field(widget=forms.FileInput, required=True)
@csrf_protect
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
new_user = form.save()
'''
just added the late three lines for check
'''
username = request.POST['username']
password = request.POST['password1']
user = authenticate(username=username, password=password)
auth.login(request, user)
request.session['username'] = username
return HttpResponseRedirect("/file_check/")
else:
form = RegisterForm()
return render_to_response("register.html", RequestContext(request, {'form':form}))
@csrf_protect
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password1']
form = UserCreationForm(request.POST)
user = authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
request.session['username'] = username
return HttpResponseRedirect('/file_check/')
else:
form = UserCreationForm()
return render_to_response("login.html", RequestContext(request, {'form':form}))
def logout(request):
auth.logout(request)
#del request.session['username']
return HttpResponseRedirect("/")
@csrf_protect
def file_check(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
if 'file' in request.FILES:
file = request.FILES['file']
if file.content_type != 'application/octet-stream':
raise forms.ValidationError('File Type Not Supported!!!')
request.session['contentType'] = file.content_type
filename = file.name
fp = open('%s/%s' % (MEDIA_ROOT, filename), 'wb')
for chunk in file.chunks():
fp.write(chunk)
fp.close()
return HttpResponseRedirect('/result/')
else:
form = UploadFileForm()
username = request.session['username']
return render_to_response('file_check.html', RequestContext(request, {'form':form, 'username':username}))
def result(request):
username = request.session['username']
content_type = request.session['contentType']
return render_to_response('result.html', {'username':username, 'content_type':content_type})
ただし、「/file_check/」でチェックするために単純なテキスト ファイル以外のファイル (たとえば、pdf ファイルなど) をアップロードしようとすると、「/file_check/ で ValidationError」が表示されます。エラーのトレースバックは
Environment:
Request Method: POST
Request URL: http://localhost:8000/file_check/
Django Version: 1.2.3
Python Version: 2.6.4
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'rocop_web.auth']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view
76. response = view_func(request, *args, **kwargs)
File "/home/kailash/workspace/rocop/rocop_web/../rocop_web/auth/views.py" in file_check
63. raise forms.ValidationError('File Type Not Supported!!!')
Exception Type: ValidationError at /file_check/
Exception Value:
私はdjangoの初心者で、解決するのが難しいと感じています。どうぞよろしくお願いいたします。