Rails ActiveStorage问题:rails_blob_path出现“找不到文件”错误,即使该路径可以手动运行

时间:2019-05-23 17:38:43

标签: ruby-on-rails ruby-on-rails-5

我有一个小型的Rails应用程序,该应用程序在本地运行良好,可以使用ActiveStorage上传docx文件并将其转换为html(还有其他功能)。要将其部署到Heroku,我需要从使用本地文件系统进行存储更改为使用S3,从而更改生成文件路径的方式。

我的研究表明,rails_blob_path(或_url)应该是我所需要的,但是我遇到了“找不到文件”错误,即使在我手动尝试使用文件路径时也可以

如何为可用于进一步转换的附件生成路径?文档说这很简单,但我无法使它正常工作!


我的应用程序具有项目,每个项目都必须通过ActiveStorage附加文件。创建项目(及其附件)后,将处理该文件并将其内容显示给用户(从Word文件中提取文本,将其与单词列表进行匹配,并存储生成的HTML和单词列表以备进一步使用由用户编辑)。

我最初的方法是在Project模型中使用此方法:

def real_file_path
  ActiveStorage::Blob.service.send(:path_for, file.key)
end

然后,在控制器中,我调用此方法进行实际的转换:

def convert_docx_file
  _file_contents = ''
  _doc = Docx::Document.open(@project.real_file_path)
  _doc.paragraphs.each do |p|
    _file_contents += p.to_html
  end
  @project.update_attributes(file_contents: _file_contents)
end

(这使用DOCX gem创建一个合适的对象,然后对其进行迭代并将段落转换为HTML。)

现在有问题的步骤是创建_doc对象。上面的代码在本地文件系统上运行良好。对于S3的使用,经过大量的研究和实验,我将其更改为:

.
.
  _doc = Docx::Document.open(rails_blob_path(@project.file))
.
.
.

在本地计算机上运行时,将产生错误:Zip::Error in ProjectsController#show File /rails/active_storage/blobs/BLAH_BLAH_BLAH/original%20file.docx not found。但是,当我将地址复制并粘贴到浏览器中时,它可以很好地下载。

任何人都可以让我知道如何获取正确的文件路径,以便我可以再次进行转换吗?

1 个答案:

答案 0 :(得分:0)

因此,最后,我通过在服务类中创建一个下载程序来避免了这个问题,对于那些可能遇到相同问题的其他人,我将保留详细信息。

控制器中的相关行现在为:

_doc = DocxDownloadService.new(@project.file).doc

和服务类(app/services/docx_download_service.rb)差不多是来自ActiveStorage文档:

class DocxDownloadService
  include ActiveStorage::Downloading
  attr_reader :blob

  def initialize(blob)
    @blob = blob
  end

  def doc
    download_blob_to_tempfile do |file|
      Docx::Document.open(file)
    end
  end
end

这既可以在本地(在我的文件系统上)也可以在使用S3的服务器上工作。