我对ruby中的文件处理不是很熟悉。我遇到的一个问题是,读取和写入二进制文件并不会产生完全相同的文件。
clone = Tempfile.new(tempfile.original_filename)
FileUtils.copy_stream(tempfile, clone)
clone.flush
从下图中可以清楚地看到它不是一个精确的文件副本,当我尝试在图像查看器中打开新创建的文件时,它会报告文件已损坏。我尝试过以不同的方式复制文件,例如clone.write(tempfile.read)
等,但没有成功。
*文件查看器还指示原始文件是ANSI Dos / Windows,并且克隆是ANSI Macintosh。文件大小也相差大约200个字节。
我想要完成的实际上只是简单地使用Tempfile两次。文件通过rails上传并作为Tempfile提供给我。我想将它提交给两个不同的restful服务,RestClient.post
自动关闭文件。另一种选择是将某种内存流克隆提交给RestClient,以便它无法关闭我的文件。如果我向RestClient提交File.open(tempfile.path)
它会产生相同的破坏文件,这表明阅读是问题,而不是写作。如果我将原始Tempfile对象提交给RestClient,它可以正常工作但是它会被关闭并删除,我无法再发送它。
请帮忙!
的问候,
皮尔
答案 0 :(得分:3)
查看这些文件的十六进制视图而不是文本编辑器的解释会更有帮助。我的猜测是至少有一个文件没有以二进制模式打开。在Ruby 1.9中,尝试
open(filename, 'rb')
open(filename, 'wb')
Tempfile.new(filename, :binmode => true)
分别用于打开文件进行读/写和创建二进制临时文件。