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

server/2024/12/26 20:58:38/

九、Django媒体文件&静态文件&文件上传

1.静态文件和媒体文件

  • 媒体文件: 用户上传的文件, 叫做media
  • 静态文件: 存放在服务器的 css, js, image等,叫做static
在Django中使用静态文件
  • {% static 'img/example.jpg' %} => static模板关键字就是在settings.py中指定的静态文件夹中(应用下的static文件夹和STATICFILES_DIR寻找到符合条件的静态文件
  • 然后将相对路径写入html标签中
  • 注意: 应用下的static文件夹里的文件(包括STATICFILES_DIR下的文件) 似乎在网站生成时都统一放在了http://127.0.0.1:8000/static/
python"> 首先确保django.contrib.staticfiles在INSTELLED_APPS中
2) 在 setting.py中定义 SRARIC_URLSTATIC_URL = '/static/'
3) 在你的app的static目录中存放静态文件,比如APP/ static/ example.jpg
4) 如果有别的静态文件,不在app的static目录下,可以通过 STATICFILES_DIRS来指定额外的静态搜索目录STATICFILES_DIR = [os.path.join(BASE_DIR, 'static'),...]
5) 在模板中使用load标签去加载文件{% load static %}<img src="/static/index.css" /><img src="{% static 'img/example.jpg' %}" />
django_30">在django中使用媒体文件

在settings中配置 MEDIA_ROOT, 就是指定文件上传的路径选项

python">MEDIA_ROOT = os.path.join(BASE_DIR,"media")

2. 文件上传

单文件上传
python">文件上传要求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':# 获取上传的文件,如果没有文件,则默认为NonemyFile = 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')
单文件上传案例

views.py

python">import os
import uuid
from django.conf import settings
from django.shortcuts import redirect, render
from django.urls import reverse
from App.models import *
# Create your views here.def index(request):return render(request, 'index.html')def index2(request):return render(request, 'index2.html')# 单文件上传
def upload1(request):if request.method == 'GET':return render(request, 'upload1.html')elif request.method == 'POST':# 单文件上传uname = request.POST.get('uname')icon = request.FILES.get('icon') # 单个文件print(uname, icon, type(icon))# 1.将上传的图片存储到后台对应的媒体文件中# file_name = icon.name   # 尽量不要使用图片的原始名称, 避免重复  # file_name = get_uuid() + icon.name[icon.name.rfind('.'):] # 获取后缀名file_name = get_uuid() + os.path.splitext(icon.name)[-1] # 获取后缀名file_path = os.path.join(settings.MEDIA_ROOT , file_name)print(file_path)with open(file_path, 'wb') as f:for chunk in icon.chunks(): # 分块写入f.write(chunk)f.flush()  # 立即写入# 2.将该媒体文件的路径,存入到数据库user = UserModel()user.name = unameuser.icon = 'uploads/' + file_name # 注意: 存储的是相对路径, 而不是绝对路径,相对于static的路径user.save()return render(request, 'upload1.html')# 获取uuid, 用于生成唯一的文件名
def get_uuid():return str(uuid.uuid4())def showicon(request, uid):if uid == None: # 如果没有传uid, 则默认为1uid = 1# 显示用户的头像user = UserModel.objects.filter(id=uid).first()print(user, user.name, user.icon)return render(request, 'showicon.html', {'user': user})    # 多文件上传
def upload2(request):if request.method == 'GET':return render(request, 'upload2.html')elif request.method == 'POST':# 接收前端的参数uname = request.POST.get('uname')uid = UserModel.objects.filter(name=uname).first().idimgs = request.FILES.getlist('imgs') # 多个文件print(uname, imgs, type(imgs))# [<InMemoryUploadedFile: chapter11_主界面.png (image/png)>, <InMemoryUploadedFile: chapter12_对话框.png (image/png)>] <class 'list'># 遍历文件列表, 依次上传for img in imgs:# 1.将上传的图片存储到后台对应的媒体文件中file_name = get_uuid() + os.path.splitext(img.name)[-1] # 获取后缀名file_path = os.path.join(settings.MEDIA_ROOT, file_name)with open(file_path, 'wb') as f:for chunk in img.chunks(): # 分块写入f.write(chunk)f.flush()  # 立即写入# 2.将该媒体文件的路径,存入到数据库photo = PhotoModel()photo.img = 'uploads/' + file_namephoto.user = UserModel.objects.filter(name=uname).first()photo.save()return redirect(reverse('showicon',kwargs={'uid': uid}))

settings.py

python">STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / 'static'
]
MEDIA_ROOT = BASE_DIR /'static/uploads'

models.py

python">from django.db import models# Create your models here.class UserModel(models.Model):name = models.CharField(max_length=32, unique=True)# 头像(存储头像的路径)icon = models.CharField(max_length=128)

upload1.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>单文件上传</title>
</head>
<body><form action="" method="post" enctype="multipart/form-data">{% csrf_token %}<p>用户名: <input type="text" name='uname'></p><p>头像: <input type="file" name="icon"></p><button>上传</button></form>
</body>
</html>

showicon.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>显示图标</title>
</head>
<body><h1>显示图标</h1><hr>{% load static  %}<p>{{user.name}}</p><img src="{% static user.icon %}" alt="">
</body>
</html>
多文件上传
python">多文件上传和单文件上传类似
1.需要在模板文件的form表单input中添加multiple
2.后台获取时使用request.FILES.getlist('myfile', None)
def file_upload2(request):if request.method == 'POST':# 获取上传的文件,如果没有文件,则默认为NonemyFiles = request.FILES.getlist('myfile', None)for myFile in myFiles:if not myFile:return HttpResponse("no files for upload")file_path = os.path.join(settings.MEDIA_ROOT, myFile.name)with open(file_path, 'ab') as fp:for part in myFile.chunks():fp.write(part)return HttpResponse("上传成功!")else:return render(request, 'index.html')
多文件上传案例

views.py

python">import os
import uuid
from django.conf import settings
from django.shortcuts import redirect, render
from django.urls import reverse
from App.models import *
# Create your views here.def index(request):return render(request, 'index.html')def index2(request):return render(request, 'index2.html')# 单文件上传
def upload1(request):if request.method == 'GET':return render(request, 'upload1.html')elif request.method == 'POST':# 单文件上传uname = request.POST.get('uname')icon = request.FILES.get('icon') # 单个文件print(uname, icon, type(icon))# 1.将上传的图片存储到后台对应的媒体文件中# file_name = icon.name   # 尽量不要使用图片的原始名称, 避免重复  # file_name = get_uuid() + icon.name[icon.name.rfind('.'):] # 获取后缀名file_name = get_uuid() + os.path.splitext(icon.name)[-1] # 获取后缀名file_path = os.path.join(settings.MEDIA_ROOT , file_name)print(file_path)with open(file_path, 'wb') as f:for chunk in icon.chunks(): # 分块写入f.write(chunk)f.flush()  # 立即写入# 2.将该媒体文件的路径,存入到数据库user = UserModel()user.name = unameuser.icon = 'uploads/' + file_name # 注意: 存储的是相对路径, 而不是绝对路径,相对于static的路径user.save()return render(request, 'upload1.html')# 获取uuid, 用于生成唯一的文件名
def get_uuid():return str(uuid.uuid4())def showicon(request, uid):if uid == None: # 如果没有传uid, 则默认为1uid = 1# 显示用户的头像user = UserModel.objects.filter(id=uid).first()print(user, user.name, user.icon)return render(request, 'showicon.html', {'user': user})    # 多文件上传
def upload2(request):if request.method == 'GET':return render(request, 'upload2.html')elif request.method == 'POST':# 接收前端的参数uname = request.POST.get('uname')uid = UserModel.objects.filter(name=uname).first().idimgs = request.FILES.getlist('imgs') # 多个文件print(uname, imgs, type(imgs))# [<InMemoryUploadedFile: chapter11_主界面.png (image/png)>, <InMemoryUploadedFile: chapter12_对话框.png (image/png)>] <class 'list'># 遍历文件列表, 依次上传for img in imgs:# 1.将上传的图片存储到后台对应的媒体文件中file_name = get_uuid() + os.path.splitext(img.name)[-1] # 获取后缀名file_path = os.path.join(settings.MEDIA_ROOT, file_name)with open(file_path, 'wb') as f:for chunk in img.chunks(): # 分块写入f.write(chunk)f.flush()  # 立即写入# 2.将该媒体文件的路径,存入到数据库photo = PhotoModel()photo.img = 'uploads/' + file_namephoto.user = UserModel.objects.filter(name=uname).first()photo.save()return redirect(reverse('showicon',kwargs={'uid': uid}))

upload2.html文件多选 -> multiple

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>多文件上传</title>
</head>
<body>{% comment %} multipart/form-data支持文件上传 {% endcomment %}{% comment %} multiple: 支持文件多选 {% endcomment %}<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}<p>用户名: <input type="text" name='uname'></p><p>选择上传的图片: <input type="file" name="imgs" multiple></p><button>上传</button></form>
</body>
</html>

showicon.html添加

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>显示图标</title>
</head>
<body><h1>显示图标</h1><hr>{% load static  %}<p>{{user.name}}</p><p>头像<img src="{% static user.icon %}" alt=""></p><hr><h3>{{user.name}}的相册</h3>{% for photo in user.photomodel_set.all  %}<img src="{% static photo.img %}" alt="" width=100>{% endfor %}</body>
</html>

http://www.ppmy.cn/server/153429.html

相关文章

嵌入式学习-QT-Day07

嵌入式学习-QT-Day07 七、文件IO 1、QFileDialog文件对话框 2、QFileInfo文件信息类 3、QFile文件读写类&#xff08;重点&#xff09; 4、UI与耗时操作 5、QThread线程类 5.1 复现程序未响应 5.2 创建并启动一个子线程 5.3 异步刷新 5.4 线程停止 6、数据持久化 七、文件IO 1、…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

Jmeter录制https请求

jmeter 5.5版本&#xff0c;chrome浏览器 1、首先添加Test Plan-Thread Group-HTTP(S) Test Script Recorder 2、设置HTTP(S) Test Script Recorder界面的Port&#xff08;监听端口&#xff0c;设置浏览器代理时需要与这里保持一致&#xff09;、HTPS Domains&#xff08;录制…

【华为OD-E卷-取出尽量少的球 100分(python、java、c++、js、c)】

【华为OD-E卷-取出尽量少的球 200分&#xff08;python、java、c、js、c&#xff09;】 题目 某部门开展 Family Day 开放日活动&#xff0c;其中有个从桶里取球的游戏&#xff0c;游戏规则如下&#xff1a; 有 N 个容量一样的小桶等距排开&#xff0c;且每个小桶都默认装了数…

小程序租赁系统开发指南与实现策略

内容概要 在如今这个快节奏的时代&#xff0c;小程序租赁系统的开发正逐渐成为许多商家提升服务质量与效率的重要选择。在设计这样一个系统时&#xff0c;首先要明白它的核心目标&#xff1a;便捷、安全。用户希望在最短的时间内找到需要的物品&#xff0c;而商家则希望通过这…

使用Excel制作通达信自定义外部数据,安排!!!

Excel相信大家电脑上都有这个工具&#xff0c;相比敲编程代码&#xff0c;用这个去做自定义数据对大多数人&#xff0c;应该是比较友好的。自定义数据分为外部序列数据&#xff0c;看了一下内容理解起来比较多&#xff0c;分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…

一起学Git【第二节:创建版本库】

创建库 这个库相当于一个目录&#xff0c;目录中的文件都被Git管理&#xff0c;会记录每个文件的修改删除和添加工作&#xff0c;便于之后随时跟踪历史记录还原到之前的某一版本。如何创建库呢&#xff1f;有两种方式&#xff0c;本地创建库和云端克隆一个库。 1.本地创建库 …

37.2 prometheus分析接口源码讲解

本节重点介绍 : 获取配置文件 config获取运行信息 runtimeinfo编译的信息 buildinfotsdb统计信息 tsdbwalreplay的信息target统计信息获取metrics的元信息 状态信息相关 获取配置文件 path /api/v1/status/config代码位置 D:\go_path\src\github.com\prometheus\prometheus…