5

我有一个 Rails 应用程序,我正在解析上传的 CSV。我刚刚发现解析已停止工作并正在调查。

我已经将其追溯到我调用.read的实例ActionDispatch::Http::UploadedFile并返回一个空字符串的事实。

上传的文件不是空的,当我检查UploadedFile对象时,它有一个属性,如@tempfile=#<File:/tmp/RackMultipart20130530-34976-6jaqt5. 如果我cat在文件系统上的那个文件,它包含我所期望的。

为什么可能.read返回一个空字符串?

我正在使用 Rails 3.2.13。

4

2 回答 2

11

尝试倒带

我的同事建议rewind之前打电话read,这很管用。显然其他一些代码首先读取文件。

更新

据我所知,没有人在我之前阅读文件。我创建了一个初始化程序来监视UploadedFile

# config/initializers/uploaded_file.rb
class ActionDispatch::Http::UploadedFile

  alias_method :old_read, :read
  def read(*args)
    Rails.logger.info "file #{self} is getting read by #{caller.first}!"
    old_read(*args)
  end
end

我没有看到任何其他对read. 考虑到可能有一些其他方法可以推进读取指针,我更进一步并完全替换了该类:

# config/initializers/uploaded_file.rb
ActionDispatch::Http::UploadedFile = Class.new do

  def initialize(*args)
    Rails.logger.info "initilized with #{args}"
  end

  def method_missing(method_name, *args, &block)
    Rails.logger.info "file got #{method_name} with #{args}.\
      Block? #{block_given?} caller? #{caller.first}"
  end

end

依然没有。我看到一个电话initialize,我的电话rewind,和我的电话read

似乎这个文件是预先缠绕到最后的。我不确定为什么会这样,但rewind对我来说仍然是解决方法。

于 2013-05-30T15:56:10.040 回答
0

如果文件刚刚上传和写入,请务必在继续之前将其关闭。例如:

out = File.open(path, 'w')
out.write(stuff)
out.close # omitting this may cause the issue described!
于 2015-12-04T18:15:34.513 回答