Rails 微信小程序上传视频后台报错(invalid %-encoding)

bakadia · 2021年06月28日 · 304 次阅读

报错信息

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��PW9(�([U���vM�|�Q                          ���?�i�"
��d2j,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'

涉及 gem

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 文件后,怎么优雅的把多余的内容删除,只保留视频的内容

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号