1

我正在使用carrierwave-postgresql来存储用户上传的文件。

我有一个名为 FileUploader 的上传器(在 /app/uploaders/file_uploader.rb 中),带有storage :postgresql_lo.

上传的文件链接到:file_oid名为 UploadedFile 的模型中的列(在 app/models/uploaded_file.rb 中),其中mount_uploader :file_oid, FileUploader

class UploadedFile < ActiveRecord::Base
  attr_accessible :file_oid, :processed, :type
  mount_uploader :file_oid, FileUploader
end

我上传文件为

f = UploadedFile.new
f.file_oid = params[:flat_file]
f.save!

现在,当我尝试读取文件时,该read方法可以正常工作,但我无法获得“每个”或“打开”。

> uf = UploadedFile.find(:first)
> uf.file_oid.read # works, gives the contents of the file
> uf.file_oid.file.read # this works too
> uf.file_oid.file.each
NoMethodError: undefined method `each' for #<CarrierWave::Storage::PostgresqlLo::File:0x000000039157a0>
> uf.file_oid.file.open
NoMethodError: private method `open' called for #<CarrierWave::Storage::PostgresqlLo::File:0x000000039157a0>
> uf.file_oid.open
NoMethodError: private method `open' called for /uploadedfile_file_oid/231132:FileUploader
4

1 回答 1

0

该类CarrierWave::Storage::PostgresqlLo::File不支持任何花哨的东西eachor open; 除了阅读整个事物、编写整个事物或获取大小之外,您无法对其中一个对象做太多事情。

但是,如果您查看read实现,您会看到:

@uploader.model.transaction do
  lo = connection.lo_open(identifier)
  content = connection.lo_read(lo, file_length)
  connection.lo_close(lo)
  content
end

因此您可以完全绕过carrierwave- postgresqllo_openlo_read并使用lo_close. connection当然,您将无法逐行读取大对象,因为大对象系统不知道行是什么它只知道可查找的字节流。

于 2013-02-11T05:19:15.980 回答