Kev*_*tre 4 ruby ruby-on-rails file
我在Rails应用程序中使用以下代码段:
require 'open-uri'
url = "http://..."
uri = URI.parse(self.url)
file = open(uri)
puts "path: #{file.path}"
Run Code Online (Sandbox Code Playgroud)
哪个适用于网络上的某些文件,然后在其他文件上崩溃:
#StringIO的未定义方法`path':0x00000102a47240>
有办法解决这个奇怪的,间歇性的问题吗?
我肯定迟到了,但......
这个问题的根源是,如果你open(url)在一个小于10kb的文件上使用它,它将自动神奇地将它转换为一个字符串IO对象,而不是使用Tempfile.每个人都指出的StringIO对象没有在path其上定义的方法.
默认值(10kb)由StringMax常量设置...
http://yard.ruby-doc.org/stdlib-2.1.0/OpenURI/Buffer.html
if defined?(OpenURI) && OpenURI::Buffer.const_defined?(StringMax)
OpenURI::Buffer.send('remove_const', StringMax)
OpenURI::Buffer.send('const_set', StringMax, 0)
end
Run Code Online (Sandbox Code Playgroud)
繁荣问题,解决了!
ps确保使用#send,否则无法访问#remove_const和#cont_set方法.pps如果你做了很多小IO,我不建议将它设置为零,因为创建的临时文件可能比仅仅更改代码以正确使用StringIO更糟糕.这一切都取决于你的用例.
不要像那样使用Open :: URI.
简单地说:
file = open(url)
Run Code Online (Sandbox Code Playgroud)
然后您可以使用read该文件,因为您有一个IO类型的对象:
body = file.read
Run Code Online (Sandbox Code Playgroud)
要么
body = open(url).read
Run Code Online (Sandbox Code Playgroud)
如果您需要路径,请使用URI解析URL并获取该路径.
| 归档时间: |
|
| 查看次数: |
2825 次 |
| 最近记录: |