场景
在客户端本地,将一些图片、文件等上传至服务端
如:
- 个人头像
- 文档等
前端部分
上传文件
请求媒体资源
<img src="/media/images/head.png" alt="未加载图片" width="200px">
<!--直接请求媒体资源,不走视图-->
后端
用户上传的资源-----统称为media资源
配置
- settings.py
MEDIA_URL = "/media/" #以‘/media/’开头的请求,为媒体资源的请求
MEDIA_ROOT = os.path.join(BASE_DIR,"media")
#别忘记创建media目录
- 主路由urls.py
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
xxx,
]
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
视图接收上传的文件
路由:/test/upload1/
视图:
方案1.
上传的文件字节流—>写入服务端文件
from django.conf import settings
def receive_view(request):
#获取文件对象
file = request.FILES.get("upload")
#file.name,上传的文件名
#file.file,内容字节流
#服务端的文件路径
s_filename = os.path.join(settings.MEDIA_ROOT,file.name)
with open(s_filename,"wb") as f:
data = file.file.read() #读取字节流数据
f.write(data)
data = {"data":"上传成功"}
return render(request,"upload.html",data)
路由:/test/upload2/
方案2.
直接上传到服务端的模型类(表)中
#models.py
from django.db import models
class FileUpload(models.Model):
desc = models.CharField("文件描述",max_length=100)
file_ = models.FileField(upload_to="images") #/media/images 子目录
#新版本中不支持字段以下划线结尾
def __str__(self):
return self.desc
class Meta:
db_table = "upload_table"
verbose_name = "上传文件" #默认复数形式
verbose_name_plural = verbose_name #单数形式
#模型类 --必须定义在 其他应用中,不能再主应用中
from media_app.models import FileUpload
def receive_view(request):
desc = request.POST.get("desc")
file_ = request.FILES.get("upload")
FileUpload.objects.create(desc=desc,file_=file_)#直接给文件对象
服务端进入media_table查看
实战代码
项目代码
提取码:pf44
在局域网内部署服务
#runserver 仅仅开发测试
python3 manage.py runserver ip1:8000
#配置文件
ALLOWED_HOST = [ip1]
#在 windows 浏览器访问
http://ip1:8000/test/upload1/
http://ip1:8000/test/upload2/
http://ip1:8000/test/media/