`
alissa
  • 浏览: 9721 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

ajax下载后台任务执行生成的csv文件

阅读更多
点击一个按钮,生成一份csv文件,这个csvs生成过程很耗时,要放到后台执行,生成完了之后,还要把文件发送到客户端,这个采用ajax定时请求,去判断文件是否生成成功
1、页面上按钮
<%= button_to_remote "CSV", {:url => {:action => 'get_csv'},
                              :confirm => "Are u sure?"},
                              :class => "btn_red" %>
2、接受请求的action
def get_csv
    spawn do  # backgroud job
      begin
        # generating csv
        # more code here
      rescue Exception => e
        pp e
        Rails.cache.write("csv_#{Process.pid}", 'error')
        Rails.cache.write("csv_#{Process.pid}_error", e)
        return
      end
     
      # mark the csv generated completed
      Rails.cache.write("csv_#{Process.pid}", true)
    end
   
    flash[:notice] = "Generating csv"
    render :update do |page|
      page.replace_html "promote", :partial => "/common/messages"
      page.insert_html :top,
                       "progress_ajax",
                        periodically_call_remote(:url => {:action => "csv_task_progress"},
                                                 :frequency => 5)
    end
  end

3、定时请求的js和action
def periodically_call_remote(options = {})
     variable = options[:variable] ||= 'poller'
     frequency = options[:frequency] ||= 10
     code = "#{variable} = new PeriodicalExecuter(function()
{#{remote_function(options)}}, #{frequency})"
     javascript_tag(code)
end

def csv_task_progress
    if Rails.cache.read("csv_#{Process.pid}").eql?('error')
      # csv generating occurred error
      Rails.cache.write("sbps_#{Process.pid}", nil)
      flash[:error] = Rails.cache.read("csv_#{Process.pid}_error")
      render :update do |page|
        page << "poller.stop();"
        page.replace_html "promote", :partial => "/common/messages"
      end
      return
    elsif Rails.cache.read("csv_#{Process.pid}").blank?
      # return if the csv file have not generated completely
      return (render :text => nil)
    end
    # prevent the later request download csv
    Rails.cache.write("csv_#{Process.pid}", false)
    flash[:notice] = "CSV Generated yet"
    download_url = "/admin/exact_count/download_csv"
    render :update  do |page|
      js = <<-EOF
        poller.stop(); // stop the periodically call
        var elemIF = document.createElement("iframe"); 
        elemIF.src = '#{download_url}'; 
        elemIF.style.display = "none"; 
        document.body.appendChild(elemIF);
      EOF
      page << js
      page.replace_html "promote", :partial => "/common/messages"
    end
  end

4、下载csv的action
def download_csv
    send_file("#{RAILS_ROOT}/tmp/csv.csv", :type=>'text/csv', :filename=>"csv.csv") 
end

至此就可以完成这个需求了
分享到:
评论

相关推荐

    大作业基于Django和Ajax实现的分布式计算应用源码.zip

    后者按钮则是下载用户选定的任务所生成的csv文件,单个任务被选择即单文件csv,多任务被选择自动压缩为压缩包后下载 其余的页面基本上都是查看,不再过多说明, 需要知道作为服务端的电脑()在局域网中所分配的IP,...

    javaweb异步导出

    这个场景通常涉及到Ajax技术、后台处理以及文件下载。以下是关于"javaweb异步导出"的相关知识点: 1. **Ajax(Asynchronous JavaScript and XML)**:Ajax的核心是通过JavaScript在不刷新整个页面的情况下与服务器...

    html前端动态获取后端数据显示到表格,实现分页显示

    同时分为两个文件serverImage和clientImage,其中包含项目源码,一些配置文件,以及后端需要处理的两个csv文件,同时包含生成docker镜像的Dockerfile,可直接在serverImage和clientImage目录先直接build客户端镜像和...

    以html形式显示或预览word,excel,pdf,txt

    这些文件格式在日常工作中广泛使用,但它们在Web浏览器中的直接展示并不直观,用户通常需要下载文件到本地然后打开。为了解决这个问题,开发者会采用将这些文件转换成HTML的形式来实现在线预览。本源码方案就是针对...

    GISTEMP-chart:CSV,AJAX,Chart.js

    标题“GISTEMP-chart:CSV,AJAX,Chart.js”涉及到三个主要技术概念:CSV(逗号分隔值)文件、AJAX(异步JavaScript和XML)以及Chart.js,一个用于创建互动图表的JavaScript库。这三个元素在IT行业中都是至关重要的...

    asp省市区3级联动 asp+ajax三级联动

    在实际应用中,这样的数据文件会被ASP程序读取并用于生成下拉菜单选项,同时Ajax会根据用户的选择动态加载市和区的数据。 总的来说,这个项目涵盖了以下几个关键知识点: 1. ASP服务器端脚本技术,用于处理用户请求...

    table控件生成数据

    "根据数据生成表格"指的是从数据库、CSV文件、JSON对象或其他数据源获取数据,并将其动态地填充到表格中。这通常涉及数据绑定技术,将数据模型与视图(即表格)连接起来,当数据改变时,表格会自动更新。例如,使用...

    cognos 报表实现一键导出

    2. **与Cognos集成**:通过Cognos的API(如Cognos Connection API或Cognos Framework Manager API),Java服务可以与Cognos系统进行通信,获取报表数据或执行导出任务。 3. **处理导出**:在Java服务中,你可以使用...

    ExtJS实现文件下载的方法实例

    2. **动态生成文件**:在某些情况下,文件可能需要在用户请求时动态生成,例如CSV报表或PDF文档。在这种情况下,后端接口应处理文件生成逻辑,完成后将文件流回给前端。 3. **文件类型处理**:对于不同类型的文件,...

    Ajax,jqgrid,标签页Iframe进销存代码

    开发者可以使用它来创建、调试和部署Ajax、jqGrid和进销存系统的后台代码。 综合以上知识点,"Ajax+JQuery+Json+Asp.net"这个压缩包可能包含了一个使用Ajax框架、jQuery库、JSON数据格式和ASP.NET技术构建的进销存...

    网上订餐系统

    AJAX的异步特性使得后台处理任务时,用户可以继续浏览其他内容,而无需等待页面刷新,实现了页面的动态性和实时性。 jQuery 是一个流行的JavaScript库,简化了DOM(文档对象模型)操作、事件处理、动画效果以及Ajax...

    全国世界所有城市联动数据(持续更新)

    在程序开发中,可以使用各种编程语言(如Python、Java)的库来读取和解析csv文件,构建联动效果。 sql(Structured Query Language)是用于管理和处理关系数据库的标准语言。城市联动的sql数据可能是包含城市信息的...

    C#导出数据到Excel

    本话题聚焦于如何利用C#将数据导出到Excel文件,这在数据分析、报表生成以及数据交换等场景中非常常见。JavaScript,尽管主要用在前端,但在与后端C#交互时也扮演着重要角色,特别是在处理动态数据和用户交互时。 1...

    jqGrid 前端框架 连接后台实例 java servlet+jsp+mysql

    首先,jqGrid允许用户通过Ajax方式动态加载数据,支持多种数据格式,包括JSON、XML和CSV等。在本实例中,它与Java Servlet进行通信,Servlet作为服务器端的处理程序,负责接收前端请求,处理业务逻辑,并与数据库...

    JS多样式报表

    "jQuery"是一个流行的JS库,它简化了DOM操作、事件处理、Ajax交互等任务,使得开发者能更高效地编写代码。在这个JS多样式报表解决方案中,可能利用jQuery来处理DOM元素,如创建、更新或删除报表元素,以及响应用户...

    php网站留言系统

    例如,可以使用PHP的fputcsv()函数来生成CSV文件。 3. **安全措施** - 输入验证:对用户输入的数据进行过滤和验证,防止SQL注入和XSS跨站脚本攻击。使用预编译语句(如PDO的prepare()和execute())来执行SQL,避免...

    ajaxpro无刷新,分页更新repeater_GridView数据源.rar

    ".aspx.cs"文件是对应的后台代码文件,通常用C#或VB.NET编写,实现了页面逻辑和数据处理。 8. **bin目录**: ASP.NET应用程序的编译结果会被放置在这个目录下,包括编译后的DLL文件和其他依赖的库。 9. **data...

    ASP.NET中读取excel内容,并显示在界面上

    或者,如果数据量较大,可以考虑将Excel文件转换为CSV格式,然后用CSV解析库来读取,比如CsvHelper。 总的来说,ASP.NET中读取Excel内容并显示的过程涉及文件上传、Excel数据处理和前端展示等多个步骤。理解这些...

    easyui 各种导出

    5. **创建下载链接**:使用`file-saver.js`可以创建一个虚拟的文件下载链接。生成文件后,通过触发这个链接的点击事件,浏览器会自动下载文件。 6. **异步处理**:由于导出可能会涉及大量数据,最好在后台处理并...

    Semi-Automated-Machine-Learning-Flask-App.zip

    用户通过界面上传文件后,Flask应用接收文件,后台进行数据处理和模型训练,然后将结果返回给前端显示。 此外,考虑到安全性和性能,项目可能还涵盖了错误处理、日志记录、数据库集成(存储用户上传的文件或模型...

Global site tag (gtag.js) - Google Analytics