问题描述
tornado框架中,使用了stream_request_body装饰器后,我们不能使用传统的方式获取文件名了, 因为request.files会是空的,即{}。
解决方式
前端获取文件名,传给后端
前端是可以获取到文件名的,可以通过header或者url参数传给tornado,然后我们在 prepare函数中,从header中获取文件名字。
从form-data中获取
data_receive函数获取到的数据,是符合formdata格式的,即:
(b"--%s\r\n" % boundary_bytes)
+ (
b'Content-Disposition: form-data; name="%s"; filename="%s"\r\n'
% (filename_bytes, filename_bytes)
)
+ (b"Content-Type: %s\r\n" % mtype.encode())
+ b"\r\n"
+ 数据
(b"--%s\r\n" % boundary_bytes)
所以我们可以在第一个chunk中获取到文件名:
def prepare(self):
self.file_name = ""
self.first_read = False
def data_received(self, chunk: bytes):
if not self.first_read:
result = re.search("filename=\"(.*?)\"", chunk.decode("utf-8"))
if result:
self.file_name = result[1]
logger.debug(f"file name is {self.file_name}")
self.first_read = True
这种方式因为要将二进制解码为字符串,在进行正则,会增加程序的运行时间。