Django---文件上传

文件上传:

1.上传至数据库:

在settings中加:
MEDIA_ROOT = os.path.join(BASE_DIR, "static/uploads")
在models中:
class Book(models.Model):
    name = models.CharField(
        max_length=40
    )
    icon = models.ImageField(
        upload_to="icons",
        null=True
    )

Django模型中的ImageField和FileField的upload_to选项是必填项,其存储路径是相对于MEIDA_ROOT而来的。

上传的文件会自动存在 static/uploads/icons中

在views中:
book = Book.objects.create(
    name=name,
    icon=myfile
)

2.上传文件至数据库(复制):

先生成随机文件名:

在app目录下创建.py文件

import uuid
import hashlib

def get_unique_str():
    # 得到一个uuid的字符串
    uuid_str = str(uuid.uuid4()).encode("utf-8")
    # 实例化md5
    md5 = hashlib.md5()
    # 进行加密
    md5.update(uuid_str)
    # 返回32位的十六进制数据
    return md5.hexdigest()
在views:
filename = get_unique_str() + "." + myfile.name.split(".")[-1]
filepath = os.path.join(settings.MEDIA_ROOT, filename)
f = open(filepath, "wb")
print(filename)
for i in myfile.chunks():
    f.write(i)
f.close()
return HttpResponse("ok")

filename=随机名+"."+后缀

file.chunks()相当于file.read()

将文件里的内容遍历辅助到新的路径

3.将文件上传至oss:

在views中:
def upload_to_oss(req):
    import oss2
    from io import BytesIO
    endpoint = 'http://oss-cn-shanghai.aliyuncs.com'
    access_key_id = 'LTAIXPTosazV9jSq'
    access_key_secret = '7uXYe15rjLzEjStAwVraExvAWFkxIw'
    bucket_name = 'share-msg'
    bucket_name_host = "share-msg.oss-cn-shanghai.aliyuncs.com"
    # 生成一个认证对象
    auth = oss2.Auth(access_key_id, access_key_secret)

    bucket = oss2.Bucket(auth, endpoint, bucket_name)

    #获取文件
    f = req.FILES.get("icon")
    # 实例化io
    buf = BytesIO()
    # 写入到内存
    for i in f.chunks():
        buf.write(i)
    #     调整指针到开头
    buf.seek(0)

    # 上传
    filename = get_unique_str() + "." + f.name.split(".")[-1]
    bucket.put_object(filename, buf.getvalue())

前面是一些oss 的配置

先将文件写入内存

buf.getvalue()等到内存中的内容

bucket.put_object(文件名,内容)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值