WickedPDF сгенерированный PDF файл загрузки со святыней не заполняет поле данных - PullRequest
0 голосов
/ 02 марта 2019

Я мигрирую из Paperclip весь мой процесс загрузки и у меня возникла проблема с созданным PDF.

Дочерняя модель, которая обрабатывает загрузку, - это полиморфная модель с именем quotepdf

В какой-то моментquotepdf экземпляр генерируется и имеет привязанное к нему вложение.

Вот модель quotepdf, адаптированная для святыни

class Quotepdf < ApplicationRecord
  include QuotesAndInvoicesUploader::Attachment.new(:quote)    
  belongs_to :quotable, polymorphic: true

end

загрузчик:

class QuotesAndInvoicesUploader < Shrine
    plugin :validation_helpers # to validate pdf
    plugin :delete_raw

    Attacher.validate do
        validate_max_size 1.megabyte
        validate_mime_type_inclusion ['application/pdf']
    end

    def generate_location(io, context)
        type  = context[:record].class.name.downcase if context[:record]
           name  = super

        [type, name].compact.join("/")
      end

end

иработник Sidekiq, который обрабатывает создание 'quotepdf record' и PDF-вложения с помощью Wickedpdf:

class PhotographerQuotePdfWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform(id)
    @quote = Photographerquote.find(id)
    ac = ActionController::Base.new()
    pdf_string = ac.render_to_string pdf: 'photographerquote-'+@quote.hashed_id.to_s, template: "photographerquote/print_quote.pdf.erb", encoding: "UTF-8", locals: {pdfquote: @quote}

    new_pdf = @quote.build_quotepdf
    new_pdf.quote = StringIO.new(pdf_string)
    new_pdf.save
  end

end

С Paperclip он работал нормально.Хотя в shrine ничего не сохраняется в столбце «quote_data» новой записи «quotepdf».Работник также не возвращает ошибок.

Кэшированный файл действительно загружен в корзину S3, поэтому файл PDF сгенерирован правильно.Окончательный файл отсутствует.

РЕДАКТИРОВАТЬ

заработал, раздев мой загрузчик:

class QuotesAndInvoicesUploader < Shrine

    def generate_location(io, context)
        type  = context[:record].class.name.downcase if context[:record]
        name  = super 

        [type, name].compact.join("/")
    end

end

Но я не понимаю, почемуранее это не удавалось: файл размером всего 22 КБ и действительно PDF.Не может быть проблемы с проверкой ..

РЕДАКТИРОВАТЬ 2

Хорошо, обнаруженный миметип действительно null

{"id":"devispdf/04aa04646f73a3710511f851200a2895","storage":"store","metadata":{"filename":null,"size":21613,"mime_type":null}}

Хотя мой инициализатор имеет Shrine.plugin :determine_mime_type

1 Ответ

0 голосов
/ 03 марта 2019

В фоновом режиме попробуйте посмотреть, что из этого получится:

Shrine.determine_mime_type(StringIO.new(pdf_string))

Если это nil, то я бы порекомендовал попробовать другой анализатор (например, :mimemagic или :marcel).

Shrine.plugin :determine_mime_type, analyzer: :mimemagic
# or
Shrine.plugin :determine_mime_type, analyzer: :marcel

Если это не помогло, вы также можете использовать анализатор на основе расширений, такой как :mime_types или :mini_mime, и в фоновом задании назначить временный файл с расширением:

tempfile = Tempfile.new(["quote", ".pdf"], binmode: true)
tempfile.write pdf_string
tempfile.open # flush & rewind

new_pdf = @quote.build_quotepdf
new_pdf.quote = tempfile
new_pdf.save! # fail loudly if save fails

В качестве альтернативы, поскольку вы присоединяетесь к фоновому заданию, вы можете просто избежать временного хранения и проверок:

pdf_file = StringIO.new(pdf_string)
uploaded_file = new_pdf.quote_attacher.store!(pdf_file)
new_pdf.quote_data = uploaded_file.to_json
new_pdf.save!
...