当前位置: 首页 > news >正文

讲讲django的文件对象

一、django文件对象是什么?

Django 抽象出了一套“文件处理体系”,核心是:

  • Django 所有文件类的基类
  • 提供统一的接口用于:
    • 读取

    • 写入

    • 迭代

    • 存储到 Storage 后端(本地/OSS/S3)

使用FileField / ImageField来构造:

class MyModel(models.Model):file = models.FileField(upload_to='files/')

这个字段对文件内容不做存储,只存储 文件路径字符串

真正的文件保存由:

  • django.core.files.File

  • 一套 Storage(默认本地文件系统)

obj.file.save('result.txt', ContentFile('hello world'))

此时 Django 会:

  1. 把 ContentFile 写入本地或 OSS 或 S3

  2. 把保存后的路径写到数据库字段 file

二、不同场景下该用哪种 Django 文件对象

场景 1:用户上传文件(常见 Web/DRF)

def upload(request):f = request.FILES['file']  # InMemoryUploadedFile 或 TemporaryUploadedFileprint(f.name, f.size, f.content_type)

场景 2:动态生成一个文件(如 CSV/JSON/图片),并保存到 FileField

from django.core.files.base import ContentFilecontent = "name,age\nTom,18\nJerry,20"
obj.file.save("data.csv", ContentFile(content))

场景 3:用 Python open 打开的本地文件,写入 FileField

from django.core.files import Filewith open('local.txt', 'rb') as f:obj.file.save('copy.txt', File(f))

三、几种文件存储的对应配置

1.本地存储:我就想存到服务器磁盘

Django 默认就是本地磁盘文件存储,用的类是:

DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

settings.py 里:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 真实文件保存路径
MEDIA_URL = '/media/'                         # 浏览器访问前缀

模型配置:

class MyModel(models.Model):file = models.FileField(upload_to='uploads/')

最后

obj.file.save('a.txt', ContentFile('hello'))

实际效果是:

  • 文件会被保存到:MEDIA_ROOT / uploads / a.txt
  • 例如:/project_root/media/uploads/a.txt
  • 数据库里的字段只保存相对路径:uploads/a.txt
  • 浏览器访问地址是:MEDIA_URL + 'uploads/a.txt'/media/uploads/a.txt

访问文件,只需要在url.py加一个静态路由:

from django.conf import settings
from django.conf.urls.static import staticurlpatterns = [# ... 你的其他 URL
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2.上云存储:S3/OSS/COS/BOS 等

1)用现成库(如 django-storages + S3 为例),需要安装:

pip install django-storages boto3

settings.py配置:

INSTALLED_APPS = [# ...'storages',
]DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'AWS_ACCESS_KEY_ID = '你的Key'
AWS_SECRET_ACCESS_KEY = '你的Secret'
AWS_STORAGE_BUCKET_NAME = '你的bucket名字'
AWS_S3_ENDPOINT_URL = 'https://s3.amazonaws.com'  # 若用其他云厂商,写他们给的S3兼容endpoint
MEDIA_URL = 'https://你的bucket域名/'   # 访问 URL 前缀

模型不需要改动:

class MyModel(models.Model):file = models.FileField(upload_to='files/')

业务代码:

obj.file.save('a.txt', ContentFile('hello cloud'))

Django 会:

  • 把文件内容通过 S3 API 上传到你的 bucket:files/a.txt
  • 数据库字段还是保存 files/a.txt
  • 页面访问路径是:MEDIA_URL + 'files/a.txt',比如:https://your-bucket.xxx.com/files/a.txt

 

http://www.jsqmd.com/news/56453/

相关文章:

  • 香港中文大学(深圳) PHY1001 - Mechanics 笔记
  • P9606 ABB
  • 微PE的磁盘化启动:不再使用WEPE64.WIM,直接从分区启动PE系统!
  • 73 Windows系统磁盘与分区知识详解
  • isnumeric() 和 isdigit() 的区别
  • 109 C盘又变红了?清理C盘的便捷方法!
  • 79 对系统迁移几种方案的经验之谈
  • 108 彻底卸载Windows Defender的开源小工具
  • 梅德乐:从愿景到实践的十七载坚守
  • 【UEFI实战】在库中使用全局变量
  • 107 如何快速保存和恢复文件的默认打开方式?
  • 90 老牌压缩软件,性能强大,开源免费!
  • 95 为什么越来越多的人不再使用eD2k了?回顾电驴的兴与衰
  • 155 重装系统电脑循环重启?问题大概率出现在这里!
  • 89 WindowsPE系统浅谈与PE系统推荐
  • 42 winntsetup版本更新
  • 138 Windows安装程序无法将Windows配置为在此计算机的硬件上运行的解决办法
  • 手搓BIOS+UEFI双启动PE启动盘
  • 139 不用PE不用RE不用U盘不双击setup.exe:独家重装Windows系统的骚操作(全网首创)
  • 39 极限节约C盘空间:符号链接的玩法新高度
  • 2025最新郑州空调/地暖维修保养服务公司最新top5推荐!空调维修/空调清洗/空调保养/地暖清洗/地暖保养,行业专业数据+市场口碑榜+选择指南,南阳/平顶山/周口/新乡
  • 第四
  • 113 隐藏此电脑中的常用文件夹
  • 78 打破 Microsoft Office 只能安装在C盘的魔咒!
  • Centos7.9-生成自定义SSL证书-用于服务器调试、部署
  • 2025空调/地暖清洗保养机构推荐——郑州科名,专业团队护航,口碑出圈,空调维修/清洗/保养,地暖清洗/保养,专业高效,服务优良
  • 全球AI周报:军备竞赛白热化,模型战争迎新纪元,巨头战略大变局
  • test-20251130
  • 第四篇Srum冲刺博客
  • 实用指南:汽车行业SCRM:企业微信+服务商模式破解汽车服务行业痛点的案例分析