代码之家  ›  专栏  ›  技术社区  ›  Lennart

使用javascript强制下载

  •  1
  • Lennart  · 技术社区  · 12 年前

    我有一个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文件中需要不同的头吗?

    3 回复  |  直到 12 年前
        1
  •  1
  •   user899205 user899205    12 年前

    正如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();          
    }); 
    

    附言:我还没有测试过。

        2
  •  1
  •   Lennart    12 年前

    我将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'));
    

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

        3
  •  0
  •   Nils    12 年前

    另一种方法是使用iframe。因此,当单击“下载”按钮时,您会在页面中注入iframe。等你把它清理干净。

    document.body.inject(
     new Element('iframe', {
        'src': 'http://url.to.download', 
        'style': {
            'display': 'none'
         }
     })
    );