WickedPDF 生成的带有 shrine 的 PDF 文件上传不会填充数据字段
WickedPDF generated PDF file upload with shrine does not populate data field
我正在从 Paperclip 迁移我的整个升级过程,但我对生成的 PDF 有疑问。
处理上传的子模型是一个名为 quotepdf
的多态模型
有时会生成一个 quotepdf
实例,并有一个附件链接到它。
这里是为shrine适配的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
以及处理 'quotepdf record' 和 Wickedpdf PDF 附件创建的 Sidekiq 工作人员:
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 曾经工作得很好。尽管使用神社,但新 'quotepdf' 记录的“quote_data”列中没有任何内容。
工作人员也没有返回任何错误。
确实已将缓存文件上传到 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
但我不明白为什么之前失败了:文件只有22KB而且确实是PDF。不能是验证问题..
编辑 2
好的,检测到的 mimetype 确实是 null
{"id":"devispdf/04aa04646f73a3710511f851200a2895","storage":"store","metadata":{"filename":null,"size":21613,"mime_type":null}}
尽管我的初始化器有 Shrine.plugin :determine_mime_type
在您的后台作业中,尝试查看输出结果:
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!
我正在从 Paperclip 迁移我的整个升级过程,但我对生成的 PDF 有疑问。
处理上传的子模型是一个名为 quotepdf
有时会生成一个 quotepdf
实例,并有一个附件链接到它。
这里是为shrine适配的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
以及处理 'quotepdf record' 和 Wickedpdf PDF 附件创建的 Sidekiq 工作人员:
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 曾经工作得很好。尽管使用神社,但新 'quotepdf' 记录的“quote_data”列中没有任何内容。 工作人员也没有返回任何错误。
确实已将缓存文件上传到 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
但我不明白为什么之前失败了:文件只有22KB而且确实是PDF。不能是验证问题..
编辑 2
好的,检测到的 mimetype 确实是 null
{"id":"devispdf/04aa04646f73a3710511f851200a2895","storage":"store","metadata":{"filename":null,"size":21613,"mime_type":null}}
尽管我的初始化器有 Shrine.plugin :determine_mime_type
在您的后台作业中,尝试查看输出结果:
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!