在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);
$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文件的宝贵回复。