Rails:将临时文件传递给 Sidekiq
Rails: Pass Tempfile to Sidekiq
我在一个将附件收集为临时文件的邮件端点上工作,然后我需要将它们传递给 Sidekiq Worker 以将它们上传到 AWS。
我的问题是我在尝试保留临时文件然后在我的工作程序中打开它时卡住了。我不知道应该用什么打开我的临时文件(路径、文件名...)。
这是我将调用 worker 的函数:
if @email
# Remove Tempfile autodelete
@email.attachments.each {|t| ObjectSpace.undefine_finalizer(t.tempfile)}
# Griddler Email to hash for Sidekiq
email = {
attachments: @email.attachments.map {|att| {
type: att.content_type,
name: att.original_filename
}},
raw_text: @email.raw_text,
raw_html: @email.raw_html,
from: @email.from,
subject: @email.subject,
to: @email.to,
cc: @email.cc
}
EmailResponseWorker.perform_async email
end
这里我使用ObjectSpace.undefine_finalizer(t.tempfile)
来关闭自动删除
然后在我的 Sidekiq Worker 中:
def perform(email)
@email = email
attachments = @email['attachments'].inject([]) do |arr, file|
object = S3_BUCKET.objects["attachments/#{SecureRandom.uuid}/#{file['name']}"].write(Tempfile.open(file['name']), acl: :public_read)
arr << {url: object.public_url.to_s, type: file['type'], name: file['name']}
end
end
这里的附件['name']是文件名
从临时文件中获取 path
并将其作为通常的文件路径处理:
path: att.tempfile.path
它是临时文件本身的路径,original_filename
是客户端传递的文件名,而不是您需要的文件名。
不要忘记在作业成功完成后取消链接。
我在一个将附件收集为临时文件的邮件端点上工作,然后我需要将它们传递给 Sidekiq Worker 以将它们上传到 AWS。
我的问题是我在尝试保留临时文件然后在我的工作程序中打开它时卡住了。我不知道应该用什么打开我的临时文件(路径、文件名...)。
这是我将调用 worker 的函数:
if @email
# Remove Tempfile autodelete
@email.attachments.each {|t| ObjectSpace.undefine_finalizer(t.tempfile)}
# Griddler Email to hash for Sidekiq
email = {
attachments: @email.attachments.map {|att| {
type: att.content_type,
name: att.original_filename
}},
raw_text: @email.raw_text,
raw_html: @email.raw_html,
from: @email.from,
subject: @email.subject,
to: @email.to,
cc: @email.cc
}
EmailResponseWorker.perform_async email
end
这里我使用ObjectSpace.undefine_finalizer(t.tempfile)
来关闭自动删除
然后在我的 Sidekiq Worker 中:
def perform(email)
@email = email
attachments = @email['attachments'].inject([]) do |arr, file|
object = S3_BUCKET.objects["attachments/#{SecureRandom.uuid}/#{file['name']}"].write(Tempfile.open(file['name']), acl: :public_read)
arr << {url: object.public_url.to_s, type: file['type'], name: file['name']}
end
end
这里的附件['name']是文件名
从临时文件中获取 path
并将其作为通常的文件路径处理:
path: att.tempfile.path
它是临时文件本身的路径,original_filename
是客户端传递的文件名,而不是您需要的文件名。
不要忘记在作业成功完成后取消链接。