1

我有一个这样的 php 文件:

<?php

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"my-data.csv\"");

$data = stripcslashes($_REQUEST['data']);
echo $data; 

?>

我可以向它发布(正确格式化的)数据,它会返回一个 csv 文件。我这样做:

    var data = $('table').toCSV('tbody > tr');
    $('table').addEvent('click', function(){            
        new Request({
                url: 'getCSV.php',
                method: 'post'                  
        }).send('data=' + data);            
    }); 

在 Firebug 中,我可以看到请求有效并且响应正常。但是没有弹出下载对话框;如何解决?我需要在 PHP 文件中使用不同的标头吗?

4

3 回答 3

1

正如 Gavin 所说,ajax 调用不能强制下载,响应只是保存到一个变量中。您必须创建一个隐藏的表单和 POST 数据。像这样:

var data = $('table').toCSV('tbody > tr');

$('table').on('click', function(){            
    $('<form action="getCSV.php" target="_new" method="POST" style="display: none;">'+
        '<textarea name="data">'+data+'</textarea>'+
      '</form>')
    .appendTo('body')
    .submit();          
}); 

PS我没有测试过。

于 2012-08-29T09:38:51.377 回答
1

我将JS更改为:

    var data = $('lijst').toCSV('tbody > tr');

    var form    = new Element('form', {method: 'post', action : 'getCSV.php'});
    var field   = new Element('input', {type: 'hidden', name: 'data', value: data});
    var submit  = new Element('input', {'type' : 'submit', 'value' : 'Download'});
    form.adopt(field,submit);

    form.inject($('lijst').getElement('caption'));

这在表格中添加了一个不错的下载按钮,并且当浏览器遵循表单提交时,会弹出下载对话框。谢谢你和我一起思考。

于 2012-08-29T09:46:22.580 回答
0

另一种方法是使用 iframe。因此,当单击“下载”按钮时,您会在页面中注入 iframe。清理干净后就可以了。

document.body.inject(
 new Element('iframe', {
    'src': 'http://url.to.download', 
    'style': {
        'display': 'none'
     }
 })
);
于 2012-09-01T11:26:02.353 回答