Django——文件上传

Django在处理文件上传时,文件数据被打包封装在request.FILES中。

一、简单上传

首先,在模型中创建表格,它必须包含一个FileField:

# models.py
from django import forms

class UploadFile(forms.Form):
    file = forms.FileField()

处理这个表单的视图将在request.FILES中收到文件数据,可以用request.FILES[‘file‘]来获取上传文件的具体数据,其中的键值‘file’是根据 file = forms.FileField()的变量名来的。

注意:request.FILES只有在请求方法为POST,并且提交请求的<form>具有enctype="multipart/form-data"属性时才有效。 否则,request.FILES将为空。

前端的html可以这样写:

<!-- upload.html -->

<!-- .....省略 -->
<body>
<form action="{% url ‘upload‘ %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="提交">
</form>
</body>
<!-- .....省略 -->

对应的URLconf为:

# urls.py

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘upload/‘, views.upload, name=‘upload‘),
]

下面是一个接收上传文件的视图范例:

# views.py

from django.http import HttpResponse
from django.shortcuts import render
from .models import UploadFile
import os

def upload_file(request):
    if request.method == ‘POST‘:
        form = UploadFile(request.POST, request.FILES) # 注意获取数据的方式
        if form.is_valid():
            name = request.FILES[‘file‘].name   # 获取文件名
            file_path = os.path.join(‘app01/image‘, name)   # 需手动创建image文件夹
            with open(file_path, ‘wb+‘) as destination:
                 for chunk in request.FILES[‘file‘].chunks():
                 destination.write(chunk)
            return HttpResponse(‘ok‘)
    else:
        form = UploadFile()
    return render(request, ‘upload.html‘, {‘form‘: form})

请注意,必须将request.FILES传递到form的构造函数中。

form = UploadFile(request.POST, request.FILES)

遍历UploadedFile.chunks(),而不是直接使用read()方法,能确保大文件不会占用系统过多的内存。

二、 使用模型处理上传的文件

如果是通过模型层的model来指定上传文件的保存方式的话,使用ModelForm更方便。 调用form.save()的时候,文件对象会保存在相应的FileField的upload_to参数指定的地方。

首先

# models.py

from django.db import models
from django import forms

class Edit(models.Model):
    image = models.FileField(upload_to=‘delete/image‘)

class EditForm(forms.ModelForm):

    class Meta:
        fields = "__all__"
        model = Edit

然后前端的html差不多:

<!-- upload.html -->

<!-- .....省略 -->
<body>
<form action="{% url ‘index‘ %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="提交">
</form>
</body>
<!-- .....省略 -->

以及对应的URLconf为:

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘index/‘, views.index, name=‘index‘),
]

最后是试图views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField

def index(request):
    if request.method == ‘POST‘:
        form = EditForm(request.POST, request.FILES)
        if form.is_valid():
# 这么做就可以了,文件会被保存到Model中upload_to参数指定的位置
            form.save()
            return HttpResponse(‘ok‘)
    else:
        form = EditForm()
    return render(request, ‘index.html‘, {‘form‘: form})
 

原文地址:https://www.cnblogs.com/lymlike/p/11426325.html

时间: 2024-08-29 11:46:10

Django——文件上传的相关文章

django文件上传

django文件上传 -------------------上传图片-------------------1.model中定义属性类型为models.ImageField类型pic=models.ImageField(upload_to='images/upload/') 2.如果属性类型为ImageField需要安装包Pilowpip install Pillow==3.4.1 3.图片存储路径1.在项目根目录下创建static文件夹 2.图片上传后,会被保存到"/static/images/

Django文件上传机制用法详解(转)

Django文件上传机制用法详解 http://www.jbxue.com/article/24283.html 分享下Django文件上传机制的用法,包括基本上传文件的原理,以及如何处理上传文件的方法,需要的朋友参考下. 当Django处理上传一个文件时,文件数据被放在request.FILES中. 这个文档解释文件怎么样被存储在磁盘上或者内存中,怎样定制默认的行为. 一,基本文件上传考虑一个包含FileField的简单的表单: 复制代码 代码示例: from  django  import 

django文件上传和序列化

django实现文件上传 使用form表单上传文件 html页面 <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .img { width: 300px; height: 300px; } </style> </head> <body> <form i

Django文件上传实例

近日在用Django框架开发过程中遇到上传用户头像问题,经多方搜索资料,终于解决问题! 1.首先,在html模版中添加类似下面的代码 1 2 3 4 5 <form enctype="multipart/form-data" method="POST" action="/view/process/upload/file">     {% csrf_token %}     <input type="file"

django文件上传下载

views: def mgmt_files(request): #列出树形目录,上传文件页面 if request.method == 'POST': path_root = "D:\\py\\ITFiles" #上传文件的主目录 myFile =request.FILES.get("file", None) # 获取上传的文件,如果没有文件,则默认为None if not myFile: dstatus = "请选择需要上传的文件!" else

django文件上传的几种方式

方式一:通过form表单中,html input 标签的“file”完成 1 2 3 4 5 6 # 前端代码uoload.html     <form method="post" action="/upload/" enctype="multipart/form-data">         <input id="user" type="text" name="user&quo

django 学习-14 Django文件上传 (Admin后台)

1.这种上传方式是用admin后台完成的,用数据库和model做 vim settings.py MEDIA_ROOT = '/headImg/'                                   文件保存在路径(还有后续) #   'django.middleware.csrf.CsrfViewMiddleware',            禁掉这个,跨站不会出问题 'django.contrib.admin',                                

Django - 文件上传

1 修改project的settings.py,添加 MEDIA_URL = '/media/' #这个是浏览器访问的地址, 例如:http://127.0.0.1:8000/media/covers/21.png MEDIA_ROOT = os.path.join(BASE_DIR, 'media') #这个是文件在服务器上保存的根目录,这里为proje根目录下的media目录,里面有covers/21.png,可以通过上面的方式访问该文件 2 修改project的urls.py文件,添加 .

django中处理文件上传文件

1 template模版文件uploadfile.html 特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype="multipart/form-data"时,request.FILES中包含文件数据,否则request.FILES为空. <form method="post" action="" enctype="multipart/form-data"