已上传的 PDF 未在 Rails 中下载

问题描述 投票:0回答:1

我的 Rails 应用程序中遇到了一个很奇怪的情况。

我有一个用于上传文档(即 PDF)的 API 调用,它通过其类定义中的

has_one_attached :file
附加到 Document 对象。

def create
    if can? :create, Document
      @document = Document.new(document_params.except(:upload_files))

      if document_params[:upload_files].present?
        uploaded_file = document_params[:upload_files].first
        @document.file_name = uploaded_file.original_filename
        @document.file_size = uploaded_file.size.to_s
        @document.file_type = uploaded_file.content_type
        @document.file.attach(io: uploaded_file.tempfile, filename: uploaded_file.original_filename, content_type: "application/pdf", identify: false).save
      end

      if @document.save
        redirect_to document_path(@organization, id: @document.id), notice: "Document successfully saved."
      else
        redirect_to root_path, alert: "Document could not be saved."
      end
    else
      raise CanCan::AccessDenied
    end
  end

如果我进入控制台,检查文档是否有附加文件,它会返回 true:

pry(main)> doc.file.attached?
...
=> true

如果我直接进入表格,我也可以确认它在那里。

19,file,Document,88,19,2024-12-04 00:55:29.154261

一切都好,对吧?好吧,当我使用

Download
API 调用时,我会得到一个为该文件生成的链接以供下载:

def download
    respond_to do |format|
      format.json do
        if @document.file.attached?
          file_url = rails_blob_url(@document.file, disposition: "attachment", content_type: @document.file_type)
          render json: { document: { file: file_url } }
        else
          render json: { error: "File not found" }, status: :not_found
        end
      end
      format.html { proxy_attachment_file_render(@document.file) }
    end
  end

我在 AJAX 调用中检索所述链接:

$.ajax({
        url: 'path/to/download/api'
        dataType: 'json',
        method: 'GET',
        success: function(response) {
        console.log(response)
        if (response.document && response.document.file) {
            const fileUrl = response.document.file;
            const link = document.createElement('a');
            link.href = fileUrl;
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        } else {
          alert('File not available for download.');
        }
      },
      error: function() { alert('Error fetching the file.');}
});

但我最终得到的结果是这些空/不存在的文件,其中浏览器告诉我

the file wasn't available on site

enter image description here

所以我对文件如何上传、附加到类以及如何存在感到有点困惑,但是当我尝试下载文件时,它无法返回。我在这里做错了什么?任何帮助将不胜感激。

ruby-on-rails activerecord rails-activestorage
1个回答
0
投票

好吧,我明白了。

尽管所有证据都表明文档已被保存,但事实是,它仍然没有被 ActiveRecord 正确保存。因此,我必须对文档的创建/保留方式进行一些扩充:

if document_params[:upload_files].present?
        document_params[:upload_files].each do |file|
          @document = @organization.documents.create(document_params.except(:upload_files))
          @document.file.attach(
            io: File.open(file.tempfile),
            filename: file.original_filename
          )
        end
       @document.save
end
© www.soinside.com 2019 - 2024. All rights reserved.