Django文件上传
form-data格式发送
form-data格式上传文件数据,文件对象存储在类字典对象request.FILES中
# print(request.POST.get('xxx')) # xxx
# print(request.POST.get('yyy')) # yyy
# print(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 640.jpg (image/jpeg)>]}>
# print(request.FILES.get('file')) # 640.jpg
上传文件
class UploadedFile在文件上传过程中,实际的文件数据以请求的形式存储。文件这个字典中的每个条目都是一个UploadedFile象(或子类)--一个上传文件的包装器。通常会使用以下方法之一来访问上传的内容:
1.UploadedFile.read() # 从文件中读取整个上传的数据。使用这种方法要小心:如果上传的文件很大,如果你试图把它读入内存,它会使你的系统不堪重负。
2.UploadedFile.multiple_chunks(chunk_size=None) # 判断文件是否足够大,一般为2.5M
3.UploadedFile.chunks(chunk_size=None) # 返回一个生成器对象,当multiple_chunks()为True时应该使用这个方法来代替read()
4.UploadedFile.name # 上传文件的name
5.UploadedFile.size # 上传文件的大小
6.UploadedFile.content_type # 上传文件时的content_type报头,例如(e.g. text/plain or application/pdf)
'''ContentType属性指定响应的 HTTP内容类型。如果未指定 ContentType,默认为TEXT/HTML。'''
8.UploadedFile.charset # 编码
存储文件常见方式
def func(request):
file = request.FILES.get('file')
with open(文件路径, "wb") as f:
for chunk in file.chunks():
f.write(chunk)
"""
循环使用UploadedFile.chunks()而不是使用read()以确保大文件不会占用系统内存。
在UploadedFile象上还有一些其他方法和属性可用;有关完整的参考信息,请参阅UploadedFile
"""
将上传的文件存储在本地
def func(request):
if request.method == 'POST':
# print(request.POST.get('xxx')) # xxx
# print(request.POST.get('yyy')) # yyy
# print(request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 640.jpg (image/jpeg)>]}>
# print(request.FILES.get('file')) # 640.jpg
file = request.FILES.get('file', None)
print(file, type(file)) # 640.jpg <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
if file is None:
return JsonResponse({'code': 1000, 'msg': '文件内容为空'})
else:
img_path = os.path.join(settings.BASE_DIR, 'media', file.name)
with open(img_path, 'wb') as f:
for chunk in file.chunks():
f.write(chunk)
return JsonResponse({'code': 200, 'msg': '写入成功'})
return JsonResponse({'code': 1001, 'msg': 'get请求'})