How to Upload and Download File in Django: PDF, Image, Any Format

In the world of web development, the ability to upload and download files is a fundamental feature for a wide range of applications. Whether you’re building a content management system, a file-sharing platform, or any other application that involves file interaction, enabling users to seamlessly upload and download files is essential. In this comprehensive guide, we’ll walk you through the process of implementing file upload and download functionality in a Django web application.

Prerequisites

Before we dive into the tutorial, make sure you have the following prerequisites in place:

  1. Django: Ensure you have Django installed. If not, you can install it using the following command:
   pip install Django
  1. Basic Understanding of Django: Familiarity with creating views, templates, and models in Django will be beneficial.

Note: This project can be used with any database as it is. No changes needed. You can learn how to Configure Database with our bellow blogs:

Step 1: Setting Up Your Django Project

Begin by creating a new Django project and app if you haven’t already. Open your terminal and run the following commands:

django-admin startproject myproject
cd myproject
python manage.py startapp fileuploads

Step 2: Creating Models

For our example, we’ll create a simple model to represent uploaded files. Open fileuploads/models.py and define the model:

from django.db import models

class UploadedFile(models.Model):
    file = models.FileField(upload_to='uploads/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

Here, the UploadedFile model has a FileField to store the uploaded file and a timestamp to record when the file was uploaded.

Step 3: Creating Views

Create views to handle both file uploads and downloads. Open fileuploads/views.py and define the views:

from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import UploadedFile
from .forms import UploadFileForm

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('upload_file')
    else:
        form = UploadFileForm()
    files = UploadedFile.objects.all()
    return render(request, 'upload_file.html', {'form': form, 'files': files})

def download_file(request, file_id):
    uploaded_file = UploadedFile.objects.get(pk=file_id)
    response = HttpResponse(uploaded_file.file, content_type='application/force-download')
    response['Content-Disposition'] = f'attachment; filename="{uploaded_file.file.name}"'
    return response

The upload_file view handles file uploads, while the download_file view facilitates file downloads.

Step 4: Creating Forms

Create a form to handle file uploads. In the fileuploads/forms.py file, define the UploadFileForm form:

from django import forms
from .models import UploadedFile

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = UploadedFile
        fields = ('file',)

Step 5: Configuring URLs

Configure the URLs to correspond to the views you’ve created. Open the fileuploads/urls.py file and define the URLs:

from django.urls import path
from . import views

urlpatterns = [
    path('upload/', views.upload_file, name='upload_file'),
    path('download/<int:file_id>/', views.download_file, name='download_file'),
]

Step 6: Creating Templates

Generate HTML templates for the upload and download pages. Inside the fileuploads/templates folder, create an HTML file named upload_file.html where on click button files will download.

<!-- fileuploads/templates/upload_file.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Upload and Download Files</title>
</head>
<body>
    <h2>Upload Files</h2>

    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>
    </form>

    <h3>Uploaded Files:</h3>
    <ul>
        {% for file in files %}
            <li><a href="{% url 'download_file' file.id %}">{{ file.file.name }}</a></li>
        {% empty %}
            <li>No files uploaded yet.</li>
        {% endfor %}
    </ul>
</body>
</html>

Step 7: Configuring Media Settings and App URLs

In your project’s settings (myproject/settings.py), configure the media settings to manage file uploads. Add the following lines at the end of the file:

import os
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Lastly, include the URLs of the fileuploads app in the project’s main urls.py file (myproject/urls.py):

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('fileuploads.urls')),
]

from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Step 8: Running Migrations and Starting the Server

Run the initial migrations to create the necessary database tables:

python manage.py makemigrations
python manage.py migrate

Now, start the development server:

python manage.py runserver

Visit http://127.0.0.1:8000/upload/ in your browser to access the upload page, where you can upload files. Clicking on the filenames will initiate the file download.

Conclusion

Congratulations! You’ve successfully implmented file upload and download functionality in your Django application. This guide has walked you through the process of setting up models, views, forms, templates, and URLs to enable users to upload and download files seamlessly. With this functionality in place, you’ve laid the foundation for building applications that involve content sharing, document management, and collaborative platforms.

Find this project on Github.

Blogs You Might Like to Read!