django(十九)文件上传:图片上传(后台上传自定义上传)(代码片段)

chenxi188 chenxi188     2023-04-26     764

关键词:

一、基本设置

参考:https://docs.djangoproject.com/zh-hans/3.0/topics/http/file-uploads/

1)配置project1/settings.py

因为图片也属于静态文件,所以保存到static目录下。

MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")

2)在static目录下创建media目录,再创建应用名称的目录,此例为app1

F:Testdjango-demoproject1>tree /f
F:.
│  db.sqlite3
│  manage.py
│
├─app1
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  urls.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─migrations
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          __init__.cpython-37.pyc
│  └─
│
├─project1
│  │  asgi.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │
│  └─
│
├─static
│  ├─css
│  ├─images
│  ├─js
│  └─media
│      └─app1
└─templates
    └─app1
            index.html

二、上传图片

模型知识回顾:

在七章https://blog.csdn.net/u010132177/article/details/103855700

字段类型里有两个类型:

  1. FileField:上传文件字段。
  2. ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。

    准备工作:

    1)执行迁移

python manage.py makemigrations

2)执行迁移(如果第1次不执行则3提示不存在auth表)

python manage.py migrate

3)创建管理员用户

python manage.py createsuperuser

4)如果第2次执行迁移提示没有更改项

可修改migrations文件夹下的0001_initial.py文件名,或删除数据库里的migrations表的对应0001_initial那条

5)相关详细操作见全栈视频10图片上传第1节

6)在python中进行图片操作,需要安装包PIL。

pip install Pillow==3.4.1

1. 后台管理admin页面上传

0)创建包含图片的模型类

将模型类的属性定义成models.ImageField类型。

1)打开app1/models.py文件,定义模型类PicTest。

class PicTest(models.Model):
    pic = models.ImageField(upload_to='booktest/')

2)回到命令行中,生成迁移。

python manage.py makemigrations

3)打开booktest/migrations/0001_initial.py文件,删除AreaInfo部分,因为这个表已经存在。

技术图片

4)回到命令行中,执行迁移。

python manage.py migrate

如果之前有操作过图书类、英雄类模型创建过数据表,又因为当前没有定义图书、英雄模型类,会提示“是否删除”,输入“no”后回车,表示不删除。

5)注册1步写的模型类

from django.contrib import admin
from app1.models import PicTest # 【1】导入app1目录下的models文件内的PicTest模型类

# Register your models here.

admin.site.register(PicTest) # 【2】注册模型类

6)运行项目登录后台:http://127.0.0.1:8000/admin

运行项目:

py manage.py runserver
  • 依次点进去即可看到上传图片按键:首页 ? App1 ? Pic tests ? 增加 pic test
  • 上传一个图片即可在static/media/app1下看到刚上传的图片
  • 如果上传非有效图片,系统会自动帮检测,并给出提示

2.自定义上传页面

1)创建模板templates/upload_pic.html

【1】图片上传必须要设置enctype="multipart/form-data",后台才能接收到数据
【2】post上传别忘记带上验证标识% csrf_token %

<!DOCTYPE html>
<html>
<head>
    <title>自定义图片上传</title>
</head>
<body>

    <!-- 【1】图片上传必须要设置enctype="multipart/form-data",
    后台才能接收到数据 -->
    <form method='post' enctype="multipart/form-data" action="/upload_handle/">
        % csrf_token % # 【2】post上传别忘记带上验证标识 #
        <input type="file" name="pic"><br/>
        <input type="submit" value="上传">
    </form>

</body>
</html>

2)编写视频函数app1/views.py

【1-5】
图上上传处理,图片2种类型:

  1. 小于2.5M放在内存中:<class ‘django.core.files.uploadedfile.InMemoryUploadedFile‘>
  2. 大于2.5放在硬盘上:<class ‘django.core.files.uploadedfile.TemporaryUploadedFile‘>
from django.shortcuts import render
from django.http import HttpResponse
from project1.settings import MEDIA_ROOT #导入上传文件保存路径 或 from django.conf import settings
from app1.models import PicTest #导入图片模型类


# /index
def index(request):
    return render(request,'app1/index.html')


# /show_upload
def show_upload(request):
    '''图片上传页'''
    return render(request,'app1/upload_pic.html')

# /upload_handle
# 图上上传处理,图片2种类型:
# 小于2.5M放在内存中:<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
# 大于2.5放在硬盘上:<class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
def upload_handle(request):
    '''图片上传处理页'''
    #【1】得到图片
    pic=request.FILES['pic']
    #【2】拼接图片保存路径+图片名
    save_path="%s/app1/%s"%(MEDIA_ROOT,pic.name)
    #【3】保存图片到指定路径,因为图片是2进制式,因此用wb,
    with open(save_path,'wb') as f:
        # pic.chunks()为图片的一系列数据,它是一一段段的,所以要用for逐个读取
        for content in pic.chunks():
            f.write(content)

    #【4】保存图片路径到数据库,此处只保存其相对上传目录的路径
    PicTest.objects.create(goods_pic='app1/%s'%pic.name)

    #【5】别忘记返回信息
    return HttpResponse('上传成功,图片地址:app1/%s'%pic.name)

3)app1/urls.py配置

"""project1 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app1 import views

urlpatterns = [
    path('index/', views.index),
    
    path('show_upload/',views.show_upload),# 图片上传页
    path('upload_handle/',views.upload_handle),# 图片上传处理页
]

效果:http://127.0.0.1:8000/show_upload/

上传图片操作后会返回上传成功,及图片地址。
对应目录下也会多一个刚上传的图片。

Django-CKEditor 图片上传

】Django-CKEditor图片上传【英文标题】:Django-CKEditorImageUpload【发布时间】:2013-06-0517:38:48【问题描述】:我目前已经安装了Django-CKEditor并拥有自己的自定义工具栏。我正在努力寻找如何启用图片上传。单击图像按钮时,我只能通... 查看详情

django后台上传的图片前台怎么显示不出来?路径的问题怎样解决?

问题如题:我在Django后台上传了一张图片,图片按照设定的上传文件路径保存到了数据库里面,然后再前台通过标签来查询出这个路径的数据,但是出来的路径确实是图片的路径,我知道在Django里写图片的绝对路径是不能显示出... 查看详情

django-ckeditor 上传图片以外的文件

】django-ckeditor上传图片以外的文件【英文标题】:django-ckeditorfilesuploadotherthanimage【发布时间】:2013-02-0500:57:41【问题描述】:我正在使用django-ckeditor。我正在上传图像文件和.swf文件中的图像和Flash上传图标。但是当我上传除这... 查看详情

django 在模型自定义保存中访问上传的文件,最佳实践?

】django在模型自定义保存中访问上传的文件,最佳实践?【英文标题】:djangoaccessinguploadedfilesinmodelcustomsave,bestpractice?【发布时间】:2012-06-1317:51:33【问题描述】:我最近一直在尝试使用django我希望能够在模型保存功能上通过imag... 查看详情

Django REST Framework 上传图片:“提交的数据不是文件”

】DjangoRESTFramework上传图片:“提交的数据不是文件”【英文标题】:DjangoRESTFrameworkuploadimage:"Thesubmitteddatawasnotafile"【发布时间】:2015-03-1803:41:08【问题描述】:我正在学习如何在Django中上传文件,在这里我遇到了一个应... 查看详情

django上传图片简单验证以及自动修改图片名称(代码片段)

django实现文件(图片)上传之后自动修改名称以及页面上传图片时的各种提醒:1、先在你项目中添加一个文件夹如:system在文件夹下添加__init__.py和storage.py文件,并在storage.py中添加如下代码:#-*-coding:utf-8-*-fromdjango.core.files.storage... 查看详情

如何从 django 中的内联表单接收上传的文件?

】如何从django中的内联表单接收上传的文件?【英文标题】:Howtoreceiveuploadedfilefromtheinlinedformindjango?【发布时间】:2011-01-1203:50:56【问题描述】:我正在尝试在django管理面板中创建一个“酷”的图像上传界面。问题是我使用内联... 查看详情

django之上传图片(代码片段)

上传图片当Django在处理文件上传的时候,文件数据被保存在request.FILESFILES中的每个键为<inputtype="file"name=""/>中的name注意:FILES只有在请求的方法为POST且提交的<form>带有enctype="multipart/form-data"的情况下才会包含数据。否则... 查看详情

django头像上传预览功能(代码片段)

页面格式注册页面这里可以看到有头像按钮,头像需求有默认的头像点击头像就可以上传图片上传图片后可以预览生成默认的头像上传默认图片到指定文件夹,然后把img标签的src指定到这里就可以,点击头像上传图片默认添加了... 查看详情

织梦上传图片提示缺少图像源文件地址

dedecms织梦后台编辑器里上传图片提示“缺少图像源文件地址”有以下原因引起1.你的网站uploads文件夹没有写入权限2.php.ini里的upload_tmp_dir没有自定义路径,或者自定义的路径没有写入权限;你也可以切换个PHP版本3.上传的图片文... 查看详情

图片选择,预览及上传

...击按钮,使用form表单提交到后台,然后通过//获取上传的文件HttpPostedFileBasefile=Request.Files[0];这一行来获取上传到后台的文件,然后来验证上传的文件是不是图片,其实在前台,通过设置input属性,就可以限制我们只能选择图片文... 查看详情

django学习之文件上传

Django学习之文件上传就这么六步!一、settings配置文件中配置MEDIA_URL='/media/'MEDIA_ROOT=os.path.join(BASE_DIR,'medias').replace('','/')#media即为图片上传的根路径二、url路由中配置urlpatterns=[url(r'^adm 查看详情

springboot入门十九,简单文件上传

项目基本配置参考SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可。现在来给项目添加一个MyBatis支持,添加方式非常简单,仅需两步即可,具体内容如下:1.pom.xml添加以下配置信息<!--文件上... 查看详情

文件上传图片

通过PHP,可以把文件上传到服务器。里面加入一些图片的判断,如果不加判断文件的类型就可以上传任意格式的文件。为了网站的安全,肯定不让上传php文件,如果有人进入你的后台,上传了一个php文件,你的网站源码,全部救... 查看详情

使用 s3 和 django-storages 并上传图片

】使用s3和django-storages并上传图片【英文标题】:usings3withdjango-storagesanduploadingimages【发布时间】:2014-07-0105:30:11【问题描述】:我正在尝试在Amazon的S3服务上上传MEDIA_FILES。我想先将它们上传到存储桶的根目录,然后在保存文件... 查看详情

django中的文件上传+ajax详细应用

【001】基于Ajax上传文件原则:如果我们使用Ajax操作在涉及到文件上传时,那就要使用FormData1.首先要明白:上传文件使用input输入框的类型是file: 2.后台我需要拿到前端传递过来的文件对象,注意文件对象并不在request.post里... 查看详情

django实现上传图片功能(代码片段)

...载网址的方式来显示的话其实也挺麻烦的,我们通过使用django-filer这个模块实现将图片文件直接放在自己的网站上。感兴趣的同学可以看下官方介绍:https://github.com/divio/django-filer 1.使用pip安装。pipinstalldjango-filer这个模块需... 查看详情

django学习14--文件上传(代码片段)

Django使用FileField 和ImageField 定义上传文本文件 和 图片文件。初始化文件上传路定义setting.py中定义MEDIA_URL 和MEDIA_ROOT两个参数1)MEDIA_ROOT   定义文件上传的绝对路径。2)MEDIA_URL   定义文件访问地址,必须以"... 查看详情