Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从S3托管文件向Heroku写入临时文件_Ruby On Rails_Heroku_Amazon S3_Temporary Files - Fatal编程技术网

Ruby on rails 从S3托管文件向Heroku写入临时文件

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) 将_

我在Heroku上有一个rails应用程序。情况是这样的:用户应该能够使用s3将PDF(批处理实例)上传到我们的应用程序中;用户还应该能够通过指定要拆分的文件路径和所需页面(创建文章实例),将上传PDF的s3网址拆分为更多PDF

所有这些都发生在对
/文章
的同一个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存储桶。