Djangoで通常のCRUD操作を使用していくつかのファイルをアップロードしようとしています。ファイルは通常アップロードされている間にプロジェクトのメディアディレクトリにアップロードされており、管理領域からファイルをアップロードしようとすると、期待されるディレクトリにアップロードされます。メディア/履歴書の内部。
データベースのモデルを定義し、メディアルートも定義して、それをurlpatterns変数にも追加しました。管理者ビューからファイルをアップロードしようとすると、すべて問題なく動作しますが、通常、ファイルをアップロードしようとすると、ファイルはmedia / cvではなくmediaディレクトリに直接アップロードされます。
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'home',
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
プロジェクトレベルのurls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('home.urls'))
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
models.py
from django.db import models
class Student(models.Model):
cv = models.FileField(upload_to='cv')
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('student/create', views.insert_student,
name='create_student'),
]
views.py
from django.core.files.storage import FileSystemStorage
from django.shortcuts import redirect
from .models import Student
def insert_student(request):
if request.method == 'POST':
cv = request.FILES['cv']
fs = FileSystemStorage(base_url='')
cvname = fs.save(cv.name, cv)
cv = fs.url(cvname)
stud = Student(cv=cv)
stud.save()
return redirect('home')
student_form.html
<form method="post" action="{% url 'create_student' %}"
enctype="multipart/form-data">
{% csrf_token %}
<input name="cv" type="file" />
<input type="submit" value="Submit" />
</form>
通常はフォームからアップロードするときに、ファイルがmedia / cv内にアップロードされることを期待していましたが、ファイルはメディアディレクトリにアップロードされています。管理者ログインから学生を追加すると、ファイルはmedia / cvディレクトリにアップロードされます。
これが発生する理由は、モデルにファイルを保存させず、を使用して明示的に保存しているためですFileSystemStorage
。そのコードのどこにも、ディレクトリをに設定していませんcv
。
が付いたモデルを使用しFileField
ているため、ファイルを保存するためにこれを行う必要があるだけです。
stud = Student(cv=request.FILES['cv'])
stud.save()
これにより、ファイルがフォルダ内のcv
ディレクトリに確実に保存されmedia
ます。ただし、投稿されていない場合は例外が発生するrequest.FILES['cv']
可能性があるため、その前にチェックを追加しKeyError
ます。また、保存する前にファイルの内容を確認することすらしていません。マルウェア/ウイルスを含むファイルを含め、誰でもこの方法で何でもアップロードできるため、これは大きなセキュリティの抜け穴です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加