Django静态文件媒体文件文件上传

news2024/11/23 2:39:27

文章目录

  • 一、静态文件和媒体文件
    • 1.在django中使用静态文件
    • 实践
    • 2.在django中使用媒体文件
  • 二、文件上传
    • 单文件上传
    • 实践
    • 多文件上传


一、静态文件和媒体文件

媒体文件: 用户上传的文件,叫做media
静态文件:存放在服务器的css,js,image,font等 叫做static

1.在django中使用静态文件

1)首先确保django.contrib.staticfiles在 INSTALLED_APPS中
2)在settings中定义STATIC_URL
	STATIC_URL = '/static/'
3)在你app的static目录中存放静态文件,比如
	App/static/example.jpg
4)如果有别的静态资源文件,不在app下的static目录下,可以通过STATICFILES_DIRS来指定额外的静态文件搜索目录。
	STATICFILES_DIRS = [
	    os.path.join(BASE_DIR, "static"),
	    ...
	]
5)在模板中使用load标签去加载静态文件
	{% load static %}
	<img src="{% static "App/example.jpg" %}" />

实践

创建一个新项目 Day06DjangoPro01

在这里插入图片描述

每一个应用中都可以新建一个static和templates

在这里插入图片描述

如果想要额外再加一些静态文件路径,就再加一个STATICFILES_DIRS
在这里插入图片描述

App\templates\index.html
一般用<link rel="stylesheet" href="{% static 'css/index.css' %}">

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用静态文件</title>
    {% load static %}
{#    <link rel="stylesheet" href="/static/css/index.css">#}
    <link rel="stylesheet" href="{% static 'css/index.css' %}">

</head>
<body>
<h2>使用静态文件</h2>
<hr>

</body>
</html>

App\static\css\index.css

h2 {
    color: #7FFF00FF;
}

根路由Day06DjangoPro01\urls.py

from django.contrib import admin
from django.urls import path
from App.views import *

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

App\views.py

from django.shortcuts import render


# 静态文件的使用
def index(request):
    return render(request, 'index.html')

在这里插入图片描述

在项目根目录下的static和templates 也是可以这样用的

2.在django中使用媒体文件

在settings中配置	MEDIA_ROOT
	MEDIA_ROOT = os.path.join(BASE_DIR, "media")

二、文件上传

单文件上传

文件上传要求form表单存在enctype="multipart/form-data"属性,并且提交方法是post。
	<form enctype="multipart/form-data" action="/uploadFile/" method="post">
		<input type="file"name="myfile" />
		<br/>
		<input type="submit" value="upload"/>
	</form>
	
最简单的文件上传:
def file_upload(request):
	if request.method =='POST':
		# 获取上传的文件,如果没有文件,则默认为None
		myFile = request.FILES.get( 'myfile'None)
		if not myFile:
			return HttpResponse("no files for upload")
		
		file_path = os.path.join(settings.MEDIA_ROOT, '1.jpg')
		with open(file_path, 'ab') as fp:
			for part in myFile.chunks():
				fp.write(part)
		return HttpResponse("上传成功!")
		
	else:
		return render(request,'index.html')

实践

在settings中配置 MEDIA_ROOT

# 媒体文件
MEDIA_ROOT = BASE_DIR / 'static/upload'

在这里插入图片描述

templates\upload1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>单文件上传</h2>
    <form action="" enctype="multipart/form-data" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="username"><br>
        头像:<input type="file"name="icon" /><br/>
		<button>上传图片</button>
	</form>
</body>
</html>

App\models.py

from django.db import models


# 用户
class UserModel(models.Model):
    # 名字
    name = models.CharField(max_length=30, unique=True)

    # 头像
    icon = models.CharField(max_length=255)

写完之后记得做迁移

生成迁移文件: python manage.py makemigrations
执行迁移: python manage.py migrate

App\views.py

import os
import uuid

from django.conf import settings

from django.shortcuts import render

# 上传文件:媒体文件
# 单文件上传
from App.models import UserModel


def upload1(request):
    if request.method == 'GET':
        return render(request, 'upload1.html')

    elif request.method == 'POST':
        # 单文件上传
        username = request.POST.get('username')
        icon = request.FILES.get('icon')  # 只有一个文件用get()
        print(icon, type(icon))  # 文件对象
        # picture3.jpg   <class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
        print(icon.name)  # picture3.jpg

        # 1. 将上传的图片存储到后端对应的媒体文件夹中
        # file_name = icon.name  # 图片名称尽量不要使用原图名称
        # file_name = gen_uuid_name() + icon.name[icon.name.rfind('.'):]  # icon.name.rfind('.') 获得最后一个.的下标, 拿到的是 .jpg
        file_name = gen_uuid_name() + os.path.splitext(icon.name)[-1]  # os.path.splitext得到的是一个数组,取最后一个, 拿到的是 .jpg

        # 后面可以加个时间戳
        file_path = os.path.join(settings.MEDIA_ROOT, file_name)  # settings.py 设置的文件路径 MEDIA_ROOT
        print('file_path', file_path)  # D:\xxx\pythonCode\Django学习\code\Day06DjangoPro01\static\upload\picture3.jpg
        # 分段写入文件
        with open(file_path, 'ab') as fp:  # ab 追加写的方式
            for part in icon.chunks():  # icon.chunks()方法 会一段一段的取,直到你取完为止,考虑到上传视频很大的话,一次性取会占很大一块内存,所以分段取
                fp.write(part)
                fp.flush()  # 写一段,清空一次缓存

        # 如果要把用户的图片存起来,不是直接把图片的二进制存起来,虽然可以存二进制,但是我们一般不存二进制
        # 2. 存到本地。将该媒体文件的路径 存入到数据库中。因为图片视频的二进制都比较大,如果存二进制到数据库会很大
        user = UserModel()
        user.name = username
        user.icon = 'upload/' + file_name
        user.save()  # 保存
        return render(request, 'upload1.html')


# 得到一个图片名称(通过uuid来得到唯一的图片名称)
def gen_uuid_name():
    return str(uuid.uuid4())  # 它会根据我们的时间还有随机数之类的东西去生成唯一的字符串

urls.py

# 上传文件
path('upload1/', upload1),

浏览器http://127.0.0.1:8000/upload1/
在这里插入图片描述
在这里插入图片描述
可以看到上传成功啦!!!

多文件上传

App\models.py

# 相册
class PhotoModel(models.Model):
    img = models.CharField(max_length=255)  # 图片地址
    # 图片所属用户
    user = models.ForeignKey(UserModel, on_delete=models.PROTECT)  # 每一个照片只属于一个用户,一对多关系

写完之后记得做迁移

生成迁移文件: python manage.py makemigrations
执行迁移: python manage.py migrate

templates\upload2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>多文件上传</h2>
    {#  enctype="multipart/form-data"  : 支持文件上传  #}
    {#  multiple: 支持文件多选  #}
    <form action="" enctype="multipart/form-data" method="post">
        {% csrf_token %}
        用户id<input type="text" name="userid"><br>
        请选择要上传的照片:<input type="file" name="imgs" multiple /><br/>
        <button>上传图片</button>
    </form>
</body>
</html>

App\views.py

import os
import uuid

from django.conf import settings

from django.shortcuts import render
from App.models import *


# 多文件上传
def upload2(request):
    if request.method == 'GET':
        return render(request, 'upload2.html')

    elif request.method == 'POST':
        userid = request.POST.get('userid')
        imgs = request.FILES.getlist('imgs')
        print('imgs: ', imgs)
        #  [<TemporaryUploadedFile: picture2.jpg (image/jpeg)>,
        #  <TemporaryUploadedFile: picture3.jpg (image/jpeg)>,...]

        for img in imgs:
            # 1. 把图片存储到uploads中
            file_name = gen_uuid_name() + os.path.splitext(img.name)[-1]
            file_path = os.path.join(settings.MEDIA_ROOT, file_name)  # 得到一个绝对文件路径
            with open(file_path, 'ab') as fp:
                for part in img.chunks():
                    fp.write(part)
                    fp.flush()
            #  2. 将图片路径存入到数据库中
            photo = PhotoModel()
            photo.img = 'uploads/' + file_name
            photo.user_id = userid  # photo.user = UserModel.objects.filter(pk=userid).first()# 没查到就是None,暂时不考虑其他问题None

            photo.save()

        return render(request, 'upload2.html')

urls.py

path('upload2/', upload2),  # 多文件上传

浏览器 http://127.0.0.1:8000/upload2/

在这里插入图片描述

在这里插入图片描述

可以看到,图片保存成功啦,数据也存到数据库啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/950522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter】使用Android Studio 创建第一个flutter应用。

前言 首先下载好 flutter sdk和 Android Studio。 FlutterSDK下载 Android Studio官网 配置 我的是 windows。 where.exe flutter dart查看flutter安装环境。 如果没有&#xff0c;自己在环境变量的path添加下flutter安装路径。 在将 Path 变量更新后&#xff0c;打开一个…

QTday1(第一个QT界面、常用类与组件)

一、Xmind整理&#xff1a; Assistant帮助文档的使用&#xff1a; 设计师界面的介绍&#xff1a; 各文件之间调用方式&#xff1a; 二、上课笔记整理&#xff1a; 1.第一个QT界面 ①创建自定义类时需要指定父类 ②第一个界面的相关操作 #include "mainwindow.h"…

比Python快3.5万倍的Mojo融资7亿,LLVM之父:不会威胁到Python,该恐惧的应该是C++

近日&#xff0c;Modular AI 公司宣布成功融资 1 亿美元&#xff08;约 7.29 亿人民币&#xff09;&#xff0c;据称这是继去年 3000 万美元融资之后的第二轮融资。 Modular AI 称他们未来的愿景是通过 AI 引擎和 Mojo 为全球开发者提供 AI 基础设施。 Modular AI 是 Chris La…

maven本地安装jar包install-file,解决没有pom的问题

背景&#xff1a; 公司因为权限问题&#xff0c;没有所有的代码&#xff0c;内部maven还在搭建&#xff0c;所以需要拿到同事的jar包&#xff0c;本地install&#xff1a; mvn install:install-file -DgroupIdcom..framework -DartifactIdcloud-api -Dversion1.0.0-SNAPSHOT …

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1,碰撞形状与视觉形状 像立方体和球体这样的简单形状,通常被称为“基本体”,通常用作碰撞块。 与…

js优雅的统计字符串字符出现次数

题目如下 统计一串字符串中每个字符出现的频率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白写法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

【算法训练-字符串】一 最长无重复子串

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是最长无重复子串或最长无重复子数组&#xff0c;这类题目出现频率还是很高的。 最长无重复子串【MID】 先来看字符串数据结构的题目 题干 解题思…

链接minio出现S3 API Requests must be made to API port. 错误记录

网上找了个链接的demo默认端口是9000 然后我登录了MinMo服务器&#xff0c;登录端口确实也是9000 不过我是通过1panle安装的 信息如下 表面了API连接要用&#xff1a;9001端口才行 修改后重启 ok

入职一家公司只会功能测试,如何进一步提升自己?

一定要帮助想上进却又迷茫的人。最近也听到一些做功能测试的同学的交流&#xff0c;天天做手工测试&#xff0c;想提升一下自己又不知道如何提升&#xff1f;其实还是在于这些同学对自己没有一个清晰的定位&#xff0c;没有明确的目标。 做为功能测试人员来讲&#xff0c;从发…

Vscode漂亮配色方案

有需要的私自&#xff0c;付费

记一次对链接、COMMON块、多重符号定义的理解

问题引入 首先是两个测试程序 // foo.c long long int a;// bar.c #include <stdio.h>int a; int main(){a 1;long long int len sizeof(a);printf("%lld\n", len);return 0; }将两个程序链接到一起 问题&#xff1a;len等于几&#xff1f; 初步分析 环境…

【数据结构与算法 三】常见数据结构与算法组合应用方式

一般的数据结构和对应的 很抱歉,作为一个文本AI模型,我无法直接绘制图表,但我可以为您列出常见的算法和数据结构分类,并为每个分类提供简要说明。您可以根据这些信息自行绘制图表。 算法分类: 搜索算法:用于在数据集中查找特定元素的算法,如线性搜索、二分搜索等。 排…

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)

汝之观览&#xff0c;吾之幸也&#xff01; 从本文开始讲下项目中用到的一些框架和技术&#xff0c;最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成&#xff0c;满足最基本的增删查改。 一、新…

从零开始探索C语言(三)----运算符和判断语句

文章目录 1. C 运算符1.1 算术运算符1.2 关系运算符1.3 逻辑运算符1.4 位运算符1.5 赋值运算符1.6 杂项运算符 ↦ sizeof & 三元1.7 C 中的运算符优先级 2. C 判断2.1 if 语句2.2 if...else 语句2.3 if...else if...else 语句2.4 ? : 运算符(三元运算符) 1. C 运算符 运算…

商业模式案例:七星拼团—微三云门门

企业战略角度&#xff1a; 七星拼团模式是一种以互联网思维为引流方式的商业战略&#xff0c;通过终端用户自主裂变新用户&#xff0c;为推荐人带来拉新奖励&#xff0c;从而构建一个共赢的商业生态系统。 终端用户角度&#xff1a; 七星拼团模式为终端用户提供了零门槛、零…

如何轻松搭建 Web 自动化测试框架(Python+selenium)

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

嗨&#xff0c;Go语言学习者们&#xff01;在编程的世界里&#xff0c;数据是核心&#xff0c;而结构体&#xff08;Struct&#xff09;是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中&#xff0c;我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌…

【Flutter】Flutter 使用 fluttertoast 实现显示 Toast 消息

【Flutter】Flutter 使用 fluttertoast 实现显示 Toast 消息 文章目录 一、前言二、安装和基础使用三、不同平台的支持情况四、如何自定义 Toast五、在实际业务中的应用六、完整的业务代码示例&#xff08;基于 Web 端&#xff09;七、总结 一、前言 在这篇文章中&#xff0c;…

关于使用远程工具连接mysql数据库时,提示:Public Key Retrieval is not allowed

我在使用DBeaver工具连接 数据库时&#xff0c;提示&#xff1a;Public Key Retrieval is not allowed&#xff0c; 我在前一天还是可以连接的&#xff0c;但是今天突然无法连接了&#xff0c; 但是最后捣鼓了一下又可以了。 具体方法&#xff1a;首先先把mysql服务停了&#x…