文件上传:
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(文件名,内容)