Ruby on rails 从S3托管文件向Heroku写入临时文件
我在Heroku上有一个rails应用程序。情况是这样的:用户应该能够使用s3将PDF(批处理实例)上传到我们的应用程序中;用户还应该能够通过指定要拆分的文件路径和所需页面(创建文章实例),将上传PDF的s3网址拆分为更多PDF 所有这些都发生在对Ruby on rails 从S3托管文件向Heroku写入临时文件,ruby-on-rails,heroku,amazon-s3,temporary-files,Ruby On Rails,Heroku,Amazon S3,Temporary Files,我在Heroku上有一个rails应用程序。情况是这样的:用户应该能够使用s3将PDF(批处理实例)上传到我们的应用程序中;用户还应该能够通过指定要拆分的文件路径和所需页面(创建文章实例),将上传PDF的s3网址拆分为更多PDF 所有这些都发生在对/文章的同一个POST请求中 以下是我今天使用的代码: def创建 if参数[:散文].class==字符串 batch\u id=params[:batch\u id].gsub(/[^\d]/,'').to\u i 分解批次(参数,批次id) 将_
/文章的同一个POST请求中
以下是我今天使用的代码:
def创建
if参数[:散文].class==字符串
batch\u id=params[:batch\u id].gsub(/[^\d]/,'').to\u i
分解批次(参数,批次id)
将_重定向到Batch.find(Batch_id),注意:“文章已成功创建。”
其他的
@随笔=随笔。新(随笔参数)
回应待办事项|格式|
如果@artison.save
format.html{将_重定向到@article,注意:'article已成功创建。}
format.json{render:show,status::created,location:@article}
其他的
format.html{render:new}
format.json{render json:@those.errors,status::unprocessable_entity}
结束
结束
结束
结束
#这是一个私有方法
def分解批次(参数,批次id)
论文数据=[]
#为每个分组的文章创建一篇单独的文章
local_batch=File.open(Rails.root.join('tmp')。to_s+“tempfd.pdf”,'wb')do|f|
f、 双模式
f、 编写HTTParty.get(Batch.find(Batch\u id).document.url).parsed\u响应
f、 路径
结束
参数[“随笔”]。拆分(“~”)。每个参数都有数据|
data=data.split(“”)
hypdf_url=hypdf.pdfextract(
本地批,
第一页:数据[1]。到,
最后一页:数据[2]。到,
bucket:'essay101',
公众:是的
)
object={student\u name:data[0],batch\u id:batch\u id,url:hypdf\u url[:url]}
由于Heroku的临时文件系统,我强烈建议尽快将该文件从文件系统中删除。或许可以使用以下方法:
用户上传到S3(最好直接:)
启动后台工作程序以获取文件并在内存中执行必要的处理
如果需要在正确处理文件时通知用户,请在数据库中设置“状态”字段,并允许前端应用程序轮询web服务器以获取更新。向用户显示“正在处理”,直到后台工作人员更改其状态
此方法还允许您的web进程快速响应,而不会占用资源,并可能触发H12(请求超时)错误。结果表明,使用文件
类不是正确的方法。但是使用Tempfile
def break_up_batch(params, batch_id, current_user)
essay_data = []
# create a seperate essay for each grouped essay
tempfile = Tempfile.new(['temppdf', '.pdf'], Rails.root.join('tmp'))
tempfile.binmode
tempfile.write HTTParty.get(Batch.find(batch_id).document.url).parsed_response
tempfile.close
save_path = tempfile.path
params["essay"].split("~").each do |data|
data = data.split(" ")
hypdf_url = HyPDF.pdfextract(
save_path,
first_page: data[1].to_i,
last_page: data[2].to_i,
bucket: 'essay101',
public: true
)
object = {student_name: data[0], batch_id: batch_id, url: hypdf_url[:url]}
essay_data << object
end
essay_data.each do |essay|
saved_essay = Essay.create(essay)
saved_essay.update_attributes(:company_id => current_user.company_id) if current_user.company_id
end
tempfile.unlink
end
def分解批次(参数、批次id、当前用户)
论文数据=[]
#为每个分组的文章创建一篇单独的文章
tempfile=tempfile.new(['tempfd','.pdf',Rails.root.join('tmp'))
tempfile.binmode
tempfile.write HTTParty.get(Batch.find(Batch\u id.document.url)).parsed\u响应
tempfile.close
save_path=tempfile.path
参数[“随笔”]。拆分(“~”)。每个参数都有数据|
data=data.split(“”)
hypdf_url=hypdf.pdfextract(
保存路径,
第一页:数据[1]。到,
最后一页:数据[2]。到,
bucket:'essay101',
公众:是的
)
object={student\u name:data[0],batch\u id:batch\u id,url:hypdf\u url[:url]}
论文数据当前用户。公司id)如果当前用户。公司id
结束
tempfile.unlink
结束
Heroku toolbelt命令Heroku run bash
创建应用程序的新部署,因此您不会看到通过rails应用程序创建的任何文件。Heroku应用程序之间不共享文件空间,因此建议使用S3存储桶。