web项目 day03(五)

普通文件上传

采用分片上传的方式 : 比如上传一张照片,现在一张大小都是几M,上传一张照片,如果不采用分片上传的方式,会将数据流一次性读到内存中,服务器在这短暂的期间需要开辟几M的空间去接收,如果此时有数百个甚至更多这样的操作,那么服务器会承受不了这样庞大的数据传输,采用分片上传的方式,将照片的数据分割成若干份,每次上传一份数据,就可以减少服务器接收的压力;还有就是分片上传可以断点续传,如果此时数据发送中断,那么根据相关算法,可以在断点的位置继续上传文件,这样可以减少不必要的流量的损耗
Django中有其封装好的文件上传分片方式,控制每次上传文件的大小为128kb

创建文件上传接口

  1. 新建路由
    在urls .py文件中新建一条路由
    在这里插入图片描述
  2. 写文件上传接口
    首先要获取用户id,然后将前端传来的头像文件进行保存
    保存的文件名使用时间戳,或者使用md5值,不用用户id命名的原因是为了防止爬虫爬取头像,暴露相关信息
    在项目根目录下新建一个media文件夹,用于保存头像文件,然后在settings .py文件中设置文件保存的路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

文件上传接口

def upload_avatar(request):
	user = request.user
	avatar = request.FILES.get('avatar')
	
	# 文件名称使用时间戳
	file_name = 'avatar-{}'.format(int(time.time()))
	
	# 1、先将文件上传到本地服务器
	
	file_path = os.path.join(settings.MEDIA_ROOT, file_name)
	
	with open(file_path, 'wb+') as destination:
		for chunk in avatar.chunks():
			destination.write(chunk)
	
	return render_json()

接下来测试文件能否成功上传
在Postman工具中上传文件要选择文件和对应的类型
在这里插入图片描述
然后后台中就接收了一个文件

扩展: 用户上传的文件(都是二进制文件的方式上传),一般情况都不对扩展名(文件后缀)进行处理,因为这个流程很麻烦,如果是采用云平台上传,云平台会有相关机制进行处理
在Linux中,有file这样一个命令,可以读取文件的相关信息,所有的二进制文件,都有其特定的标识表示这是一个什么文件,
在这里插入图片描述
用vim打开这个文件
在这里插入图片描述
文件上传的处理很麻烦,也很严格,需要对文件进行二进制的处理,识别该文件是什么类型文件,然后将文件的权限设为只读,这样才能防止文件中带有恶意的代码对服务器进行攻击

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值