F, [2021-06-28T15:45:20.726228 #3647] FATAL -- : [2cfaf5da-b1a0-405b-b0df-2831808cef38] Rack::QueryParser::InvalidParameterError (invalid %-encoding ("file"; filename="file-1624866321926"
Content-Type: text/plain
ftypisomisomiso2avc1mp4freey@mdatGVJ�\LC?���<�C�����= ��=%�
$8{.c��$S �h�],��n_A��P�W9(�([U���vM�|�Q� ���?�i�"
��d2�j,BOree�'j�����z�0�.5J����`�
�e��K��y�����3�)):J�'
F, [2021-06-28T15:45:20.726312 #3647] FATAL -- : [2cfaf5da-b1a0-405b-b0df-2831808cef38] rack (2.0.1) lib/rack/query_parser.rb:72:in `rescue in parse_nested_query'
[2cfaf5da-b1a0-405b-b0df-2831808cef38] rack (2.0.1) lib/rack/query_parser.rb:60:in `parse_nested_query'
[2cfaf5da-b1a0-405b-b0df-2831808cef38] rack (2.0.1) lib/rack/request.rb:468:in `parse_query'
[2cfaf5da-b1a0-405b-b0df-2831808cef38] rack (2.0.1) lib/rack/request.rb:343:in `POST'
[2cfaf5da-b1a0-405b-b0df-2831808cef38] actionpack (5.0.1) lib/action_dispatch/http/request.rb:355:in `block (2 levels) in POST'
rack (2.0.1)
rails (5.0.1)
初看是一个未处理的“%”导致 rack 在解析请求报错了,但是这是一个二进制文件上传,未处理的“%”应该是文件内的,不知道 rack 是怎么解析请求。 于是我尝试写了一个中间件提前截取了 rack 的 env["rack.request.form_vars"],大致内容如图: 中间乱码部分是一个视频,提取出来保存.mp4 就可以正常使用了。
现在有两种路子可以走,用自定义中间件把 env["rack.request.form_vars"] 调整成 rack 能解析的样子。或者用自定义中间件把内容先存到一个 tmp 的文件内,然后把会报错的内容清除,到 controller 再处理。
链接:https://pan.baidu.com/s/1rnYJSQ5wXUO3glZb-_V2wg 提取码:j52c
1.怎么调整才能调整成 rack 能解析的模样
2.先直接存到一个 tmp 文件后,怎么优雅的把多余的内容删除,只保留视频的内容