1

可能重复:
通过 JQuery AJAX Post 下载不起作用

filedownload.php 有以下片段。

$file = 'cut.png';
header("Content-Type: image/png");
header('Content-Disposition: attachment; filename="'.$file.'"');
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
readfile($file);
exit();

AJAX 调用

jQuery.post('filedownload.php',{            
  'file'  :  result  // not used for the time being                    
 });

filedownload.php我对该文件进行了ajax调用。它不允许用户下载文件。但如果我直接运行 php,它允许用户下载文件。可能是什么问题 ?

我想使用核心功能而不是使用 jQuery 插件。如果不可能,插件会很好。

鉴于我使用 ajax 因为页面无法刷新。

4

1 回答 1

3

问题

让我们以具有打开、保存、导入和导出功能的电子表格编辑器等生产力 Web 应用程序为例。打开和保存选项将涉及从数据库加载电子表格,而导入和导出处理用户机器上的本地文件。要实现导出行为,您可能会决定用户应该首先保存他们的电子表格,以便您将数据从后端导出到文件。但是让我们假设您希望允许用户在不保存数据的情况下导出他们的数据,也许是为了让他们可以选择在本地工作而无需在服务器上存储数据。为此,您需要将当前电子表格数据发送到后端并接收要下载的文件。不幸的是,这不能使用 Ajax 来处理,因为 Ajax 只能接收文本形式的响应。在要保存的数据相当长的情况下,这会带来相当大的问题。

解决方法

为了发出请求,您需要使用 GET 或 POST 发出常规(不是 Ajax)HTTP 请求。如果数据相当短,您可能会使用 GET 请求(可能只需将 Window.location 设置为导出 url),但由于浏览器对 GET 请求长度的限制不同,很可能需要 POST。以下插件允许您发出一个请求,该请求以与 jQuery 的本机 Ajax 函数类似的语法返回一个文件。

解决问题的jQuery代码

jQuery.download = function(url, data, method){
    //url and data options required
    if( url && data ){ 
        //data can be string of parameters or array/object
        data = typeof data == 'string' ? data : jQuery.param(data);
        //split params into form inputs
        var inputs = '';
        jQuery.each(data.split('&'), function(){ 
            var pair = this.split('=');
            inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ pair[1] +'" />'; 
        });
        //send request
        jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
        .appendTo('body').submit().remove();
    };
};

如何打电话

$.download('filedownload.php','filename='+filename );

阅读更多

于 2012-12-14T07:08:51.330 回答