找回密码
 立即注册
首页 业界区 安全 讲讲django的文件对象

讲讲django的文件对象

老僻贞 6 天前
一、django文件对象是什么?

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

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

    • 读取
    • 写入
    • 迭代
    • 存储到 Storage 后端(本地/OSS/S3)

使用FileField / ImageField来构造:
  1. class MyModel(models.Model):
  2.     file = models.FileField(upload_to='files/')
复制代码
这个字段对文件内容不做存储,只存储 文件路径字符串
真正的文件保存由:

  • django.core.files.File
  • 一套 Storage(默认本地文件系统)
  1. obj.file.save('result.txt', ContentFile('hello world'))
复制代码
此时 Django 会:

  • 把 ContentFile 写入本地或 OSS 或 S3
  • 把保存后的路径写到数据库字段 file
二、不同场景下该用哪种 Django 文件对象

场景 1:用户上传文件(常见 Web/DRF)
  1. def upload(request):
  2.     f = request.FILES['file']  # InMemoryUploadedFile 或 TemporaryUploadedFile
  3.     print(f.name, f.size, f.content_type)
复制代码
场景 2:动态生成一个文件(如 CSV/JSON/图片),并保存到 FileField
  1. from django.core.files.base import ContentFile
  2. content = "name,age\nTom,18\nJerry,20"
  3. obj.file.save("data.csv", ContentFile(content))
复制代码
场景 3:用 Python open 打开的本地文件,写入 FileField
  1. from django.core.files import File
  2. with open('local.txt', 'rb') as f:
  3.     obj.file.save('copy.txt', File(f))
复制代码
三、几种文件存储的对应配置
1.本地存储:我就想存到服务器磁盘
Django 默认就是本地磁盘文件存储,用的类是:
  1. DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
复制代码
在 settings.py 里:
  1. import os
  2. BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  3. MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 真实文件保存路径
  4. MEDIA_URL = '/media/'                         # 浏览器访问前缀
复制代码
模型配置:
  1. class MyModel(models.Model):
  2.     file = models.FileField(upload_to='uploads/')
复制代码
最后
  1. 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加一个静态路由:
  1. from django.conf import settings
  2. from django.conf.urls.static import static
  3. urlpatterns = [
  4.     # ... 你的其他 URL
  5. ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
复制代码
2.上云存储:S3/OSS/COS/BOS 等
1)用现成库(如 django-storages + S3 为例),需要安装:
  1. pip install django-storages boto3
复制代码
settings.py配置:
  1. INSTALLED_APPS = [
  2.     # ...
  3.     'storages',
  4. ]
  5. DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
  6. AWS_ACCESS_KEY_ID = '你的Key'
  7. AWS_SECRET_ACCESS_KEY = '你的Secret'
  8. AWS_STORAGE_BUCKET_NAME = '你的bucket名字'
  9. AWS_S3_ENDPOINT_URL = 'https://s3.amazonaws.com'  # 若用其他云厂商,写他们给的S3兼容endpoint
  10. MEDIA_URL = 'https://你的bucket域名/'   # 访问 URL 前缀
复制代码
模型不需要改动:
  1. class MyModel(models.Model):
  2.     file = models.FileField(upload_to='files/')
复制代码
业务代码:
  1. 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
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册