在Javascript中发布并重定向文件下载

在Javascript中发布并重定向文件下载,javascript,php,jquery,post,redirect,Javascript,Php,Jquery,Post,Redirect,我在这个网站或其他网站(,…)上读过很多文章,但没有任何有价值的解决方案。 我的问题如下: $h = @fopen($csv_file_name, 'w'); fputcsv($h, $csv_row, ',', '"'); fclose($h); // export file content to JS header('Content-Encoding: UTF-8'); header('Content-Type: text/ csv; c

我在这个网站或其他网站(,…)上读过很多文章,但没有任何有价值的解决方案。 我的问题如下:

$h = @fopen($csv_file_name, 'w');
      fputcsv($h, $csv_row, ',', '"');
      fclose($h);
      // export file content to JS
      header('Content-Encoding: UTF-8');
   header('Content-Type: text/ csv; charset =UTF-8');
   header('Content-Disposition: attachment; filename=export-table.csv');
   header(' Pragma: no-cache');
   echo "\xEF\xBB\xBF"; // UTF-8 BOM
   readfile($csv_file_name);
  • 在我的网站(html5,JQuery)中,有一个表。网站的特色 是将表格导出为csv文件,可用于 下载
  • 此功能的实现如下所示:

    2.1调用javascript来提取表的数据

    2.2此JS重定向到php服务,并将数据作为参数传递。代码是 以下:

  • $h = @fopen($csv_file_name, 'w');
          fputcsv($h, $csv_row, ',', '"');
          fclose($h);
          // export file content to JS
          header('Content-Encoding: UTF-8');
       header('Content-Type: text/ csv; charset =UTF-8');
       header('Content-Disposition: attachment; filename=export-table.csv');
       header(' Pragma: no-cache');
       echo "\xEF\xBB\xBF"; // UTF-8 BOM
       readfile($csv_file_name);
    
    var url=jmcnet.request.getOrigin()+'/commons/php/dt_csv_export.php';
    location.href=url+“?action=generate&csv\u type=export\u task&csv\u data=“+encodeURIComponent(csv))

    2.3 php脚本格式化输入(csv_数据参数),编写临时文件并返回临时文件的内容。代码如下:

    $h = @fopen($csv_file_name, 'w');
          fputcsv($h, $csv_row, ',', '"');
          fclose($h);
          // export file content to JS
          header('Content-Encoding: UTF-8');
       header('Content-Type: text/ csv; charset =UTF-8');
       header('Content-Disposition: attachment; filename=export-table.csv');
       header(' Pragma: no-cache');
       echo "\xEF\xBB\xBF"; // UTF-8 BOM
       readfile($csv_file_name);
    
    2.4 php文件删除(取消链接)临时文件并退出

    我的问题是,当表很长时,调用的URL无效,并且对Php的JS调用关闭

    因此,我设想以下3种解决方案,但没有一种是显而易见的,所有这些都会导致其他问题:

  • S1:不要做一个GET,而是在JS中做一个POST。所以csv_数据的大小 没关系了。问题是我会有内容 调用成功后JS var中csv文件的 了解如何重定向到内容位于JS变量中的页面?我 我想这样做会丢失所有标题信息
  • S2:在JS中压缩csv_数据参数,并在Php中解压。 我只是不知道怎么做,如果可能的话
  • S3:使用POST调用php。修改Php以返回 创建临时文件,并在JS中重定向到此临时URL。 问题是我的Php必须生成一个文件到目录中 在Internet上直接可见,文件名必须唯一且 在用户读取文件后,无法简单地删除该文件 浏览器(我讨厌cron或其他东西)

  • 我肯定我不是第一个遇到这个问题的人,所以我需要你的帮助,看看解决这个问题的最佳做法是什么。

    我想你可能把问题复杂化了一点。不需要所有的JS重定向功能,只需将表单操作属性指向csv_导出php代码,然后使用POST发送数据

    如果需要,可以通过编辑php.ini中的post_max_size选项来修改post请求的最大大小。下面是我的照片:

    ; Maximum size of POST data that PHP will accept.
    ; Its value may be 0 to disable the limit. It is ignored if POST data reading
    ; is disabled through enable_post_data_reading.
    ; http://php.net/post-max-size
    post_max_size = 8M
    
    至于写入临时文件,php内置了I/O流来处理。出于您的目的,您可能希望使用php://memory 或php://temp (更多关于这些的信息如下:)

    所以你可以这样做:

    示例HTML:

    <html>
    <head>
    <!-- include jquery because you say you are using it -->
    <script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
    
    <script>
    //just a dummy function to represent your js to extract csv data from a table
    function extract_table_data(){
        var csv = "field1,field2,field3\n\
    value1,value2,value3\n\
    value4,value5,value5";
        return csv;
    }
    
    $( document ).ready(function() {
        //export link click handler
        $('#export_link').click(function() {
            $('#csv_data').val(extract_table_data());
            $('#theform').submit();
        });
    });
    </script>
    </head>
    <body>
    <a id='export_link'>Export CSV</a>
    <form id='theform' method='post' action='dropcsv.php'>
        <input type='hidden' name='csv_data' id='csv_data'/>
    </form>
    </body>
    </html>
    

    当然,不要忘记添加错误检查并清理输入。

    因此,表中的数据在后端无法通过数据库或其他方式使用?如果在导出时将其持久化,以便在重定向页面上获取它呢?就数据的外观而言,POST可以与GET几乎完全相同,区别在于数据的位置,即,您发送
    csv\u data=“+encodeURIComponent(csv)
    ,并使用
    $\u POST[“csv\u data”]在PHP中读取它
    $\u请求[“csv\u数据”]
    。如果您的代码处理的是小数据,而问题只是长URI,因此您切换了在JavaScript中发送数据的位置,请记住在PHP中镜像此更改(如果尚未准备好进行此操作),将表单操作更改为要处理的PHP页面可能是最简单的,并通过post@Tobias:不可能。格式化是在JS端完成的。非常感谢!它成功了。展望未来,我已经找到了一个jquery插件(jquery.redirect可用),它完全符合您的建议。再次感谢您关于在Php中使用temporay文件的宝贵回复。