python 文件上传 web服务器,python-关于用 aiohttp 写服务器, 上传文件的问题及解决方案...

在处理后台接收前台分段上传文件时,遇到ValueError:找不到开始边界,导致文件内容为空。问题源于aiohttp的StreamReader在读取数据时可能导致数据丢失。解决方案是避免在上传数据时读取内容,从而防止数据丢失。具体做法是修改aiohttp的streams.py文件,阻止其在处理上传数据时进行不必要的读取操作。
摘要由CSDN通过智能技术生成

问题描述

Error handling request

Traceback (most recent call last):

File "F:\Anaconda\lib\site-packages\aiohttp\web_protocol.py", line 418, in start

resp = await task

File "F:\Anaconda\lib\site-packages\aiohttp\web_app.py", line 458, in _handle

resp = await handler(request)

File "F:\Anaconda\lib\site-packages\aiohttp\web_middlewares.py", line 119, in impl

return await handler(request)

File "F:\任务自动化\evn\middleware.py", line 15, in findRoot

response = await handler(request)

File "F:\Anaconda\lib\site-packages\aiohttp_session\__init__.py", line 152, in factory

response = await handler(request)

File "F:\Anaconda\lib\site-packages\aiohttp\web_urldispatcher.py", line 890, in _iter

resp = await method()

File "F:\任务自动化\app\automatedTask\views\user.py", line 56, in post

return await getattr(self, self.request.match_info.get("method"))(data)

File "F:\任务自动化\app\automatedTask\views\project.py", line 46, in addProj

uploadFile = await data.next()

File "F:\Anaconda\lib\site-packages\aiohttp\multipart.py", line 561, in next

await self._read_until_first_boundary()

File "F:\Anaconda\lib\site-packages\aiohttp\multipart.py", line 627, in _read_until_first_boundary

% (self._boundary))

ValueError: Could not find starting boundary b'------WebKitFormBoundaryeVkJyLKSiXXP1UA2'

当前台向后台上传文件时(分段上传),后台出现上传文件内容为空的情况,

Request Handler:

Accept: */*

Accept-Encoding: gzip, deflate, br

Accept-Language: zh-CN,zh;q=0.9

Cache-Control: no-cache

Connection: keep-alive

Content-Length: 268

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHd2De0BjpWABxVOL

Cookie: AIOHTTP_APP_SET="gAAAAABdKxlC5Pf_lq1T82VRPgJR70M1NKsC0Y8O83ygUqhYjeeYsYKlZM67DjXAfPMO3uSaoNjB1oAeiMo79AWSn3HFaOxxnqzDi9I6LaLEi9QBWuWUx2QAmbzcCGVG3xbSxBTfmX4BIuJaSUsHPXXfuBMf58U8GP-ALflIuIhOnqjMQ_CtXQpEa92e8c5OgRQozaslvMyQ8_EjAwhLMtEqCZSggutF86HDd6AFiAzMkOfJtiD6gJA="

Host: 127.0.0.1:10000

Origin: http://127.0.0.1:10000

Pragma: no-cache

Referer: http://127.0.0.1:10000/automatedTask

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36

经研究为 aiohttp StreamReader 会调用 readany 方法读取数据(collections.deque())就会造成数据丢失,所以当数据为上传数据时(当为普通的 POST 请求时还需要读取数据),则将不进行数据读取操作,就能解决问题。

修改方案

找到对应的 Python 依赖包安装环境(/usr/local/lib/pythonX.X/dist-packages) 下的 aiohttp, 将 streams.py 复制到 aiohttp 目录下

因无法上传文件, 所以 streams.py 内容的详细请参见 我的位置笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值