我有一个 Rails 应用程序,我正在解析上传的 CSV。我刚刚发现解析已停止工作并正在调查。
我已经追溯到我调用 .read
的事实。在 ActionDispatch::Http::UploadedFile
的实例上,并且返回一个空字符串。
上传的文件不是空的,当我检查 UploadedFile
对象,它有一个类似 @tempfile=#<File:/tmp/RackMultipart20130530-34976-6jaqt5
的属性.如果我 cat
文件系统上的那个文件,它包含我所期望的。
为什么可能.read
返回一个空字符串?
我正在使用 Rails 3.2.13。
最佳答案
尝试倒带
我的同事建议调用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
对我来说仍然是修复。
关于ruby-on-rails - ActionDispatch::Http::UploadedFile#read 返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16840613/