【问题标题】:Multiple file uploads in SinatraSinatra 中的多个文件上传
【发布时间】:2013-09-17 22:02:16
【问题描述】:

我正在编写一个简单的 Sinatra 应用程序,但遇到<input type="file" multiple /> 无法让 Rack 在读取文件时抛出 NoMethodError: undefined method 'bytesize' for (Hash) 的问题。

表格是这样写的:

<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="images[]" multiple />
</form>

但是接收端抛出上述错误,在我的任何代码执行之前,也就是说,Rack 没有正确解析input[name=images]。我是否错误地发送了表格?如果我去掉括号[],那么只会发送(许多)最后一个文件,但我觉得我可能遗漏了一些东西......

澄清一下:这是 Sinatra v1.4.3 和 Rack v1.5.2,后者是抛出异常的那个。完整回溯here

【问题讨论】:

  • 错误出现在 Ruby 代码中。您需要发布操作源和任何其他相关代码。
  • 是的,它专门在 Rack 的 utils.rb 上,正如我所说,它没有到达我的代码。我希望我的数组类型字段是问题所在。
  • 没有代码?此外,这似乎不是 full 回溯。哪里有异常?
  • 没有代码,因为异常不会触及我的代码,也就是说,它是由 Rack 抛出的。

标签: ruby file-upload sinatra


【解决方案1】:

唯一让我失望的是您不使用 POST 方法——也许您的问题与此有关。无论如何,以下代码非常适合我。我希望这会给你一个提示如何修复你的代码。

require 'sinatra'

get '/' do
  <<-HTML
  <html>
  <head><title>Multi file upload</title></head>
  <body>
    <form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="images[]" multiple />
      <input type="submit" />
    </form>
  </body>
  </html>
  HTML
end

post '/upload' do
  content_type :text

  res = "I received the following files:\n"
  res << params['images'].map{|f| f[:filename] }.join("\n")
  res
end

【讨论】:

  • 感谢您的回答,帕特里克!我只是复制和粘贴不正确,我将更新问题以反映这一点。出于好奇,您使用的是哪个 Rack/Sinatra 版本?
  • 不客气!我在 MRI 2.0.0p195 上使用 Rack 1.5.2 和 Sinatra 1.4.3 来测试代码。
  • 我刚刚用 MRI 1.9.3-p429 试了一下,效果也不错。
  • 这很奇怪,调试了几天,但没想到简单的nginx重启就可以解决问题。将标记为已回答,因为您非常乐于助人,这可能对其他人有所帮助。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 2019-01-29
  • 2019-08-12
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多