<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>bakadia (bakadia)</title>
    <link>https://ruby-china.org/bakadia</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>微信小程序上传视频后台报错（invalid %-encoding）</title>
      <description>&lt;h2 id="报错信息"&gt;报错信息&lt;/h2&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;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?���&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;C&lt;/span&gt;&lt;span class="err"&gt;�����=&lt;/span&gt; &lt;span class="err"&gt;��=%�&lt;/span&gt;
&lt;span class="err"&gt;$8{.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="err"&gt;��$&lt;/span&gt;&lt;span class="na"&gt;S&lt;/span&gt; &lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="err"&gt;�],��&lt;/span&gt;&lt;span class="na"&gt;n_A&lt;/span&gt;&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;P&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;W9&lt;/span&gt;&lt;span class="err"&gt;(�([&lt;/span&gt;&lt;span class="na"&gt;U&lt;/span&gt;&lt;span class="err"&gt;���&lt;/span&gt;&lt;span class="na"&gt;vM&lt;/span&gt;&lt;span class="err"&gt;�|�&lt;/span&gt;&lt;span class="na"&gt;Q&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;                          &lt;span class="err"&gt;���?�&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;�"&lt;/span&gt;
&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;d2&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="na"&gt;BOree&lt;/span&gt;&lt;span class="err"&gt;�'&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="err"&gt;�����&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="err"&gt;�0�.5&lt;/span&gt;&lt;span class="na"&gt;J&lt;/span&gt;&lt;span class="err"&gt;����`�&lt;/span&gt;
&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;K&lt;/span&gt;&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="err"&gt;�����3�))&lt;/span&gt;&lt;span class="na"&gt;:J&lt;/span&gt;&lt;span class="err"&gt;�'&lt;/span&gt;
&lt;span class="na"&gt;F&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;[2021&lt;/span&gt;&lt;span class="na"&gt;-06-28T15:45:20.726312&lt;/span&gt; &lt;span class="na"&gt;#3647&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;FATAL&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;query_parser.rb:72:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;rescue&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;parse_nested_query&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;query_parser.rb:60:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;parse_nested_query&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;request.rb:468:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;parse_query&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;request.rb:343:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;POST&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;actionpack&lt;/span&gt; &lt;span class="err"&gt;(5.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;action_dispatch&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;request.rb:355:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt; &lt;span class="err"&gt;(2&lt;/span&gt; &lt;span class="na"&gt;levels&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;POST&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="涉及gem"&gt;涉及 gem&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rack&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rails&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="自救过程"&gt;自救过程&lt;/h2&gt;
&lt;p&gt;初看是一个未处理的“%”导致 rack 在解析请求报错了，但是这是一个二进制文件上传，未处理的“%”应该是文件内的，不知道 rack 是怎么解析请求。
&lt;img title=":sweat_smile:" alt="😅" src="https://twemoji.ruby-china.com/2/svg/1f605.svg" class="twemoji"&gt; 于是我尝试写了一个中间件提前截取了 rack 的 env["rack.request.form_vars"]，大致内容如图：&lt;img src="https://l.ruby-china.com/photo/bakadia/49ccc219-82bb-4a06-990d-afcf6c5e2c48.png!large" title="" alt=""&gt;
中间乱码部分是一个视频，提取出来保存.mp4 就可以正常使用了。&lt;/p&gt;

&lt;p&gt;现在有两种路子可以走，用自定义中间件把 env["rack.request.form_vars"] 调整成 rack 能解析的样子。或者用自定义中间件把内容先存到一个 tmp 的文件内，然后把会报错的内容清除，到 controller 再处理。&lt;/p&gt;
&lt;h2 id="测试文件"&gt;测试文件&lt;/h2&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;链接：https://pan.baidu.com/s/1rnYJSQ5wXUO3glZb-_V2wg  提取码：j52c 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="遇到难题"&gt;遇到难题&lt;/h2&gt;
&lt;p&gt;1.怎么调整才能调整成 rack 能解析的模样&lt;/p&gt;

&lt;p&gt;2.先直接存到一个 tmp 文件后，怎么优雅的把多余的内容删除，只保留视频的内容&lt;/p&gt;</description>
      <author>bakadia</author>
      <pubDate>Mon, 28 Jun 2021 16:19:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/41419</link>
      <guid>https://ruby-china.org/topics/41419</guid>
    </item>
    <item>
      <title>新手有关 eml 读取转换问题</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mail'&lt;/span&gt;
&lt;span class="n"&gt;mail_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'images/tmp.eml'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;
&lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用了以上方式读取 eml 邮件，拿出来发现 body 编码格式是 7bit，解析困难。&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&gt;  然后用了几种转码方法都没有成功
并没有把内容转化成 UTF-8，就卡这里了。求问怎么正常转换成 UTF-8，或者直接把 eml 的文件转成 html 或者 txt&lt;/p&gt;</description>
      <author>bakadia</author>
      <pubDate>Wed, 05 Dec 2018 18:52:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/37860</link>
      <guid>https://ruby-china.org/topics/37860</guid>
    </item>
  </channel>
</rss>
