在Javascript中POST并重定向文件下载

时间:2014-01-08 13:15:25

标签: javascript php jquery post redirect

我在本网站或其他网站(Redirect with POST to application/csv without formjQuery.post(), PHP and redirects,...)中阅读了很多文章,但没有任何有价值的解决方案。 我的问题如下:

  1. 在我的网站(html5,JQuery)中,有一个表格。该网站的一个功能 是将表导出为可用的csv文件 下载,
  2. 此功能实现如下:

    2.1调用javascript来提取表的数据,

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

  3. var url= jmcnet.request.getOrigin()+'/commons/php/dt_csv_export.php' ; location.href = url+"?action=generate&csv_type=export_task&csv_data=" +encodeURIComponent(csv);

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

    $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个解决方案,但没有一个是明显的,所有都会导致其他问题:

    1. S1:不要在JS中进行GET而是POST。所以csv_data的大小 没关系了。问题是我会有内容 调用成功后,JS var中的csv文件,我不知道或 找到如何重定向到内容在JS var中的页面?一世 猜测我会丢失所有标题信息。
    2. S2:在JS中压缩csv_data参数并在Php中解压缩。 我只是不知道怎么做,如果有可能......
    3. S3:用POST调用php。修改Php以返回URL 临时文件,并在JS中重定向到此临时URL。 问题是我的Php必须在dir中生成一个文件 在Internet上直接可见,文件名必须是唯一的 在读取文件后,无法简单地删除该文件 浏览器(我讨厌cron或其他什么)。
    4. 我确定我不是第一个遇到这个问题的人,所以我需要你的帮助才能看出这个问题的最佳做法。

1 个答案:

答案 0 :(得分:3)

我认为你可能过于复杂了一点。不需要所有JS重定向内容,只需将表单操作属性指向csv_export php代码并使用POST发送数据。

如果需要,您可以通过编辑php.ini中的post_max_size选项来修改发布请求的最大大小。看看我的样子:

; 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(有关这些内容的更多信息:http://www.php.net/manual/en/wrappers.php.php

所以你可以这样做:

示例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>

dropcsv.php

//filename for our csv attachment
$export_filename = 'thefile.csv';
//grab csv data
$csv_data = $_POST['csv_data'];
//open file in memory
$f = fopen('php://memory', 'w'); //use php://temp if you want a tmp file instead
//load up csv file
fwrite($f, $csv_data);
// go back to the beginning of the file
fseek($f, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="'.$export_filename.'"');
fpassthru($f);
fclose($f);

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