Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何直接从ZipEntry(RubyZip、回形针、Rails 3)获取临时文件对象(内容类型正确,无需写入磁盘)?_File_Ruby On Rails 3_Paperclip_Inputstream_Rubyzip - Fatal编程技术网

File 如何直接从ZipEntry(RubyZip、回形针、Rails 3)获取临时文件对象(内容类型正确,无需写入磁盘)?

File 如何直接从ZipEntry(RubyZip、回形针、Rails 3)获取临时文件对象(内容类型正确,无需写入磁盘)?,file,ruby-on-rails-3,paperclip,inputstream,rubyzip,File,Ruby On Rails 3,Paperclip,Inputstream,Rubyzip,我目前正在尝试直接从zip文件将图像文件附加到模型(即,不首先将它们保存在磁盘上)。似乎应该有一种更清晰的方法将ZipEntry转换为Tempfile或可以存储在内存中的文件,以便传递给知道如何处理它的另一个方法或对象 这是我的密码: def extract (file = nil) Zip::ZipFile.open(file) { |zip_file| zip_file.each { |image| photo = self.photos.build #

我目前正在尝试直接从zip文件将图像文件附加到模型(即,不首先将它们保存在磁盘上)。似乎应该有一种更清晰的方法将ZipEntry转换为Tempfile或可以存储在内存中的文件,以便传递给知道如何处理它的另一个方法或对象

这是我的密码:

def extract (file = nil)
  Zip::ZipFile.open(file) { |zip_file|
    zip_file.each { |image|
      photo = self.photos.build
      # photo.image = image # this doesn't work
      # photo.image = File.open image # also doesn't work
      # photo.image = File.new image.filename
      photo.save
    }
  }
end
但问题是photo.image是模型的附件(通过回形针),将某个对象指定为附件要求该对象为文件对象。然而,我一辈子都搞不懂如何将ZipEntry转换成文件。我所见过的打开或创建文件的唯一方法是在其路径中使用字符串,这意味着我必须将文件提取到某个位置。真的,这看起来很傻。为什么我不能将ZipEntry文件提取到输出流中,并在那里将其转换为一个文件

所以,最终的问题是:我能从一个Zip文件中提取一个ZipEntry并将其直接转换为一个文件对象(或者将其直接附加为一个回形针对象)吗?或者,即使最终该版本将被删除,我是否仍无法在连接之前将其存储在硬盘上

更新 多亏了蓝莓田,我想我离我的解决方案有点近了。下面是我添加的代码行,它为我提供了所需的Tempfile/File:

photo.image = zip_file.get_output_stream image
但是,我的
Photo
对象不会接受传递的文件,因为它不是
image/jpeg
。事实上,检查文件的
内容\u类型
会显示
application/x-empty
。我认为这可能是因为获取输出流似乎在文件末尾附加了一个时间戳,因此它看起来像
imagename.jpg20110203-20203-hukq0n
编辑:此外,它创建的临时文件不包含任何数据,大小为0。看来这可能不是答案

那么,下一个问题:有人知道如何得到这个给我一个图像/jpeg文件吗

更新

我又在玩这个了。似乎输出流不是要走的路,而是输入流(这一直让我感到困惑)。使用ZipEntry上的get_input_流,我获取文件中的二进制数据。我想现在我只需要弄清楚如何将其放入回形针附件(作为文件对象)。我已经尝试将ZipInputStream直接推送到附件,但当然,这不起作用。我真的很难相信没有人试图把一个提取出来的拉链当作一个文件。有什么理由认为这是糟糕的编程实践吗?在我看来,跳过临时文件的磁盘写入是完全可以接受的,并且在Zip存档管理之类的东西中得到支持

无论如何,问题仍然存在:


有没有办法将输入流转换为文件对象(或Tempfile)?最好不必写入磁盘。

查看ZipFile上的get\u input\u流和get\u output\u流消息。

试试这个

Zip::ZipFile.open(params[:avatar].path) do |zipfile|
  zipfile.each do |entry|
    filename = entry.name
    basename = File.basename(filename)

    tempfile = Tempfile.new(basename)
    tempfile.binmode
    tempfile.write entry.get_input_stream.read

    user = User.new
    user.avatar = {
      :tempfile => tempfile,
      :filename => filename
    }
    user.save

  end
end

我试过了。使用zip_文件。get_输出_流(图像)未生成文件。然而,该模型似乎将该文件解释为“application/x-empty”,这导致它失败。它似乎还将文件名读取为“image_name.jpg20110203-20203-1lyjn3i”,我假设这是回形针为版本跟踪提供图像的标准时间戳。你知道有什么方法可以确保它是jpeg格式的吗?事实上,我刚查过。输出流作为临时文件打开。创建临时文件时会添加该时间戳。我刚刚检查了提取的Tempfile的内容类型,结果显示为application/x-empty。这是可行的,但Tempfile创建的语法不正确。我对其进行了编辑,以使用不同的语法。在本例中,您将user.avatar设置为哈希。User.avatar是回形针::附件吗?如果是这样的话,如何传递散列?我试过了,但对我不起作用。回形针:附件为不同类型的对象(如StringIO和Tempfile)提供了一组“io适配器”,但我查看了io_适配器,没有找到一个可以处理哈希的适配器。
File
对象只是封装了一个文件名。它们没有任何描述的内容类型。