普通文件上传
采用分片上传的方式 : 比如上传一张照片,现在一张大小都是几M,上传一张照片,如果不采用分片上传的方式,会将数据流一次性读到内存中,服务器在这短暂的期间需要开辟几M的空间去接收,如果此时有数百个甚至更多这样的操作,那么服务器会承受不了这样庞大的数据传输,采用分片上传的方式,将照片的数据分割成若干份,每次上传一份数据,就可以减少服务器接收的压力;还有就是分片上传可以断点续传,如果此时数据发送中断,那么根据相关算法,可以在断点的位置继续上传文件,这样可以减少不必要的流量的损耗
Django中有其封装好的文件上传分片方式,控制每次上传文件的大小为128kb
创建文件上传接口
- 新建路由
在urls .py文件中新建一条路由
- 写文件上传接口
首先要获取用户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打开这个文件
文件上传的处理很麻烦,也很严格,需要对文件进行二进制的处理,识别该文件是什么类型文件,然后将文件的权限设为只读,这样才能防止文件中带有恶意的代码对服务器进行攻击