如何在看到 "Getting Errno::ENOENT ' no such file or directory @ rb_sysopen'" 时在 Rails 中获取正确的临时文件文件路径

How to get a proper filepath of Tempfile in Rails when seeing "Getting Errno::ENOENT ' no such file or directory @ rb_sysopen'"

我想在我的网站上显示演示文稿文件的预览。我正在尝试制作一个临时文件,该文件从存储在活动存储中的 Microsoft PowerPoint Open XML (.pptx) 文件中读取。

我在临时文件上使用 Docsplit.extract_images 将幻灯片转换为图像,以便在某种形式的图像轮播中将其显示为预览。

我有幻灯片参数,例如 [:name, :ppt, pages: [] ],其中 ppthas_one_attached,页面是 has_many_attached。这就是我的 slides_controller 的样子:

def create
    @slide = Slide.new(slide_params)

    respond_to do |format|
      if @slide.save
        tempfile = Tempfile.new([ 'foobar', '.pptx'])
        tempfile.binmode

        begin
          @slide.ppt.download { |chunk| tempfile.write(chunk) }
          tempfile.flush
          tempfile.rewind
        ensure
          tempfile.close!
        end
        @slide.pages << Docsplit.extract_images("#{tempfile.path}", :size => '1080x', :format => [:png])
        tempfile.unlink

        format.html { redirect_to slide_url(@slide), notice: "Slide was successfully created." }
        format.json { render :show, status: :created, location: @slide }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @slide.errors, status: :unprocessable_entity }
      end
    end
  end

我遇到 Errno::ENOENT no such file or directory @ rb_sysopen 错误。

这是获取 tempfile 路径的正确方法吗?

此外,如果我使用 tempfile.path 而不是 "#{tempfile.path}",我会收到 nil to string 错误。

请确保您使用的是 tempfile.close!这会取消链接每个 https://ruby-doc.org/stdlib-2.5.3/libdoc/tempfile/rdoc/Tempfile.html#method-i-close-21

的文件

如果您只是使用没有爆炸 (!) 的 close,那么您应该已经准备就绪!