django文件上传

本文介绍了Django中文件上传的实现方法。前端通过form和input标签提交文件,规定请求方式和属性。后端接收并保存文件,用数据库记录文件存储位置,使用MEDIA_ROOT指定存储路径,还可通过指定MEDIA_URL在debug模式下在线查看上传的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件上传

  • 文件上传指的是:客户端上传文件至服务器

1. 前端代码

前端用来提交文件;如下,input_file.html

<form action="{% url 'index' %}" method="post" enctype="multipart/form-data">
    <input type="file" name="pic"><br>
    <input type="submit">
</form>

  • form标签用于提交上传的文件数据
    – 需要规定发起请求的方式为postmethod=post
    – 需要规定enctypeenctype='multipart/form-data'
  • input标签用户客户端选择提交的文件
    – 需要规定type属性, type='file'
    – 需要设置name属性,该属性值任意,本案例中设置为name='pic'
    name属性的值,将用于后端获取提交的表单数据

2. 后端代码的实现

2.1 接收并保存文件;
# 渲染前端页面
def render_html(request):
	return render(request, 'input_file.html')

# 获取客户端提交的表单数据,并保存
def get_files(request):
	# 获取客户端提交的文件数据
    mypic = request.FILES.get('pic')
    # 将文件写入到指定的位置
    with open('this_pic.jpg', 'wb') as f:
    	for chunk in mypic.chunks()
    		f.write(chunk)
    return HttpResponse('success')
    
2.2 使用数据库记录文件存储的位置
# models.py
class PicModel(models.Model):
   # 通过upload_to参数,制定文件存储的位置
   pic = models.FileField(upload_to="files") 


# views.py
def render_html(request):  # 渲染前端页面
   return render(request, 'input_file.html')
   
def get_files(request):  # 获取客户端提交的表单数据,并保存在指定位置,记录存储地址
   pic_file = request.FILES.get('thumbnail')
   obj = PicModel(pic=pic_file)
   obj.save()
   return HttpResponse('success')
   

此时,会将文件保存至files中,数据库中pic字段存储的是文件的路径;
其中FileField(upload_to="files"),中upload_to指定了文件存储的路径;

2.3 使用MEDIA_ROOT指定文件存储的位置

settings.py中可以通过设置MEDIA_ROOT, 指定文件存储的位置。如下, 指定MEDIA_ROOT='media', 则服务器接收到文件后, 将会把文件存储在media路径下

# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR,'media')  
# 指定文件存储在当前项目路径下的media文件夹中


# urls.py
from django.urls import path
from front import views

urlpatterns = [
	path('1/', views.render_html)
    path('2/', views.get_files),
] 


# models.py
class PicModel(models.Model):
	# 此时不需要再指定upload_to参数了
    pic = models.FileField() 
    

如果同时指定了upload_to='files'MEDIA_ROOT=os.path.join(BASE_DIR,'media')则会将文件上传至当前项目路径/media/files路径中;

2.4 通过指定MEDIA_URL线上查看上传的文件
# settings.py
MEDIA_URL = '/media/'


# urls.py
from django.urls import path
from front import views
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('1/', views.render_html),
    path('2/', views.get_filtes)
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

debug模式下可以通过http://127.0.0.1:8000/media/文件名在线查看文件

### Django 文件上传功能实现 在 Django 中实现文件上传是一项常见的需求,可以通过多种方法完成这一操作。以下是基于 `Model` 和 `Form` 的两种主要方式来实现文件上传的功能。 #### 方法一:使用 ModelForm 实现文件上传 此方法利用 Django 提供的模型表单 (`ModelForm`) 来简化文件上传的过程。具体步骤如下: 1. **创建数据模型** 需要在应用中的 `models.py` 定义一个用于存储文件的数据模型。 ```python from django.db import models class Document(models.Model): description = models.CharField(max_length=255, blank=True) document = models.FileField(upload_to='documents/') uploaded_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.description ``` 上述代码中,字段 `document` 使用了 `FileField` 类型,并指定了文件保存路径为 `upload_to='documents/'`[^1]。 2. **定义表单类** 创建一个继承自 `forms.ModelForm` 的表单类,在 `forms.py` 中编写如下代码: ```python from django import forms from .models import Document class DocumentForm(forms.ModelForm): class Meta: model = Document fields = ('description', 'document') ``` 3. **视图函数配置** 编写视图逻辑以接收并处理上传请求。可以在 `views.py` 中添加以下内容: ```python from django.shortcuts import render, redirect from .forms import DocumentForm def upload_file(request): if request.method == 'POST': form = DocumentForm(request.POST, request.FILES) if form.is_valid(): form.save() return redirect('home') # 跳转到主页或其他页面 else: form = DocumentForm() return render(request, 'upload.html', {'form': form}) ``` 4. **模板设计** 设计前端 HTML 表格以便用户可以提交文件。例如,在 `templates/upload.html` 中加入下面的内容: ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">Upload</button> </form> ``` #### 方法二:通过普通 Form 处理多文件上传 如果需要支持一次上传多个文件,则可采用普通的 `Form` 方式配合 DRF (Django Rest Framework) 或者原生 Django 进行扩展。 ```python from django import forms class UploadFileForm(forms.Form): title = forms.CharField(max_length=50) files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True})) ``` 上述例子展示了如何构建一个多文件输入框的形式[^2]。 对于更复杂的场景比如 RESTful API 接口下的批量文件传输,请参阅相关文档或者框架指南进一步学习。 --- ### 总结 无论是简单的单一文件还是复杂的大规模并发文件上传任务,Django 均提供了灵活而强大的工具集帮助开发者快速搭建所需服务。以上介绍了基本流程以及部分高级特性,实际部署过程中还需要注意安全性设置等问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值