HOWTO · Django
Django에서 파일 업로드 및 다운로드하기
관리자가 파일을 업로드하고 방문자가 첨부 파일로 다운로드할 수 있는 Django 예제를 만듭니다.
이 페이지의 내용
관리자가 파일을 업로드하고 방문자에게 다운로드 링크를 제공하려면, 업로드를 Django의 FileField로 저장하고 선택한 파일을 FileResponse로 반환하세요. 이 튜토리얼은 Django 5.2를 대상으로 하며 개발용으로 로컬 미디어 스토리지를 사용합니다. 여기에 표시된 Django 통합은 제공된 런타임에서 실행되지 않았습니다.
Django에서 파일 업로드 및 다운로드하기
django-admin startproject django_project로 프로젝트와 앱을 만들고, manage.py가 있는 디렉터리에서 python manage.py startapp blog를 실행합니다. django_project/settings.py에서 프로젝트의 INSTALLED_APPS에 "blog.apps.BlogConfig"를 추가합니다.
업로드된 미디어는 CSS, JavaScript와 같은 정적 자산과 분리되어 있습니다. settings.py에서 MEDIA_URL = "/media/"와 MEDIA_ROOT = BASE_DIR / "media"를 설정합니다. MEDIA_ROOT는 업로드된 파일의 파일 시스템 위치이고, MEDIA_URL은 파일을 제공하는 데 사용되는 URL 접두사입니다. 업로드는 정적 파일 디렉터리 밖에 보관하세요.
blog/models.py에서 title = models.CharField(max_length=200)와 file = models.FileField(upload_to="uploads/")를 가진 UploadedFile 모델을 정의합니다. 관리자 화면에서 항목을 식별할 수 있도록 def __str__(self): return self.title을 추가합니다. blog/admin.py에서 admin.site.register(UploadedFile)로 등록합니다. 모델을 만든 후 python manage.py makemigrations와 python manage.py migrate를 실행한 다음, python manage.py createsuperuser로 관리자를 만듭니다.
blog/views.py에 두 개의 뷰를 추가합니다. 홈 뷰는 쿼리셋을 files 컨텍스트 값으로 렌더링할 수 있습니다: return render(request, "blog/home.html", {"files": UploadedFile.objects.all()}). 다운로드 뷰에서는 item = get_object_or_404(UploadedFile, pk=file_id)로 행을 조회하고 FileResponse(item.file.open("rb"), as_attachment=True, filename=item.file.name.rsplit("/", 1)[-1])을 반환합니다. FileResponse, get_object_or_404, UploadedFile을 임포트합니다. 이 프레임워크 전용 Django 통합은 여기에서 실행되지 않았습니다. FileResponse는 파일을 스트리밍하고, as_attachment=True는 브라우저에 파일을 다운로드하도록 요청합니다. 저장된 파일은 구성된 스토리지 안에 계속 존재해야 합니다.
뷰는 경로의 마지막 구성 요소를 브라우저에 제공할 이름으로 사용합니다. 이 작은 Python 예제는 저장된 업로드 경로를 사용해 그 파일 이름 단계를 보여줍니다.
이 예제를 실행하세요:
stored_name = "uploads/sample.mp3"
download_name = stored_name.rsplit("/", 1)[-1]
print(download_name)
sample.mp3
blog/urls.py에서 홈 경로를 홈 뷰에 매핑하고 "download/<int:file_id>/"를 download_file에 매핑하며, 후자에 "download_file"이라는 이름을 부여합니다. 프로젝트 URL 구성에서 path("", include("blog.urls"))로 blog.urls를 포함합니다. blog/templates/blog/home.html에서 각 항목에 대한 링크를 렌더링합니다:
{% for item in files %}
<h2>{{ item.title }}</h2>
<a href="{% url 'download_file' item.pk %}">Download {{ item.title }}</a>
{% endfor %}
python manage.py runserver로 개발 서버를 실행하고, /admin/에서 로그인한 뒤, 제목과 작은 샘플 파일을 가진 UploadedFile을 추가합니다. 홈 페이지에 그 제목이 표시되고, 해당 링크를 선택하면 파일이 다운로드 첨부 파일로 반환되어야 합니다. 이 튜토리얼은 예상 동작을 설명하지만 관찰된 런타임 출력은 포함하지 않습니다.
로컬 개발 사이트에서는 settings.DEBUG가 true일 때 프로젝트 URL 패턴에 static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)를 추가하여 Django가 업로드된 미디어를 제공할 수 있습니다. static은 django.conf.urls.static에서 임포트합니다. 이 헬퍼는 개발용이며 운영 파일 서버가 아닙니다. 운영 환경에서는 웹 서버나 객체 스토리지가 미디어를 제공하도록 구성하고, 각 파일을 공개할지 인증을 요구할지 결정하세요. 업로드가 비공개인 경우, MEDIA_URL을 직접 노출하는 대신 적절한 권한 검사로 다운로드 뷰를 보호하세요. 업로드를 검증하고 애플리케이션에 맞는 크기와 파일 형식 제한을 적용하세요.