在python中的最常见的一个功能,各种文件的上传:
一、在Django中
@csrf_exempt
def upload_file(request):
"""
上传通用接口
"""
...
if request.method == 'POST':
file = request.FILES.get('file')
shutil.rmtree(MEDIA_ROOT)
os.makedirs(MEDIA_ROOT, exist_ok=True)
if not hasattr(file, 'size'):
return JsonResponse({'code': 500, 'msg': '找不到文件对象'})
_, ext = os.path.splitext(file.name)
if ext not in ('.xls',):
return JsonResponse({'code': 500, 'msg': '仅支持xls格式'})
if img.size > 5242880:
return Response({'code': 500, 'msg': '文件不可大于5MB'})
filename = str(int(time.time())) + str(ext)
with open(f'{MEDIA_ROOT}/{filename}', 'ab') as f:
for chunk in file.chunks():
f.write(chunk)
return JsonResponse({
'code': 0,
'msg': '上传成功!',
'url': f"{filename}"})
二、在Flask中
class UploadFile(object):
'''上传图片'''
@staticmethod
def post(_request, *args, **kwargs) -> jsonify:
'''
上传图片
{
“file”: fileIO
}
'''
file = request.files.get('file')
_, ext = os.path.splitext(file.filename)
if ext not in ('.png', '.PNG', '.jpg', '.JPG'):
return jsonify({'code': 500, 'msg': '仅支持png和jpg格式'})
filename = str(int(time.time())) + str(ext)
file_abs_path = f'{MEDIA_PATH}/{filename}'
logger.success(f'文件上传路径为:{file_abs_path}')
file.save(file_abs_path)
return jsonify({'code': 0, 'msg': 'success', 'path': f'/media/{filename}'})
注意:
在默认情况下,Django会将整个上传文件加载到内存中。当通过request.FILES获取上传文件对象时,文件内容已经完全加载到内存中,并存储在InMemoryUploadedFile对象中。
这种默认行为适用于处理较小的文件,因为将文件加载到内存中可以提供更快的读写速度和更简单的处理方式。但是,对于大型文件,一次性将整个文件加载到内存可能会导致内存消耗过高。
为了处理大型文件,Django提供了一种配置选项,即`FILE_UPLOAD_HANDLERS`设置。可以通过修改这个设置来选择不同的文件处理器,以改变文件上传的行为。
其中,`TemporaryFileUploadHandler`是Django的默认文件处理器,它将文件内容存储在内存中。如果希望将大型文件保存到临时文件而不是内存中,可以使用`TemporaryFileUploadHandler`。
在`settings.py`文件中,您可以进行如下配置:
FILE_UPLOAD_HANDLERS = [
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]
通过配置`FILE_UPLOAD_HANDLERS`为`TemporaryFileUploadHandler`,Django将使用临时文件来存储上传的文件内容,而不是加载到内存中。这样可以降低内存消耗,适用于处理大型文件。
请注意,使用临时文件处理器可能会对服务器的磁盘空间产生影响,因为文件内容会被保存在磁盘上的临时文件中。因此,在配置文件处理器时,请确保服务器有足够的磁盘空间来存储上传的文件。
在Flask中,默认情况下,上传的文件会被保存到磁盘的临时文件中,而不是加载到内存中。这适用于处理各种大小的文件,包括大型文件。
Flask使用了Werkzeug库来处理文件上传,而Werkzeug默认使用TemporaryFileStorage
来保存上传的文件。这意味着文件会被写入磁盘上的临时文件,并且可以通过文件路径进行访问。