1

我正在尝试将一些详细信息附加到文件中并添加以供下载。

我为此目的使用 JavaScript 和 PHP。单击下载按钮,它将触发 AJAX 请求。

$.ajax({
  url:"php/test.php",
  type: 'POST',
  data: { totalQuery : test1, },

  success: function(finalEntityList){
  },
});

让我们假设test.php有一个单行代码

$html="Test";

现在我想将它添加到文件中并使其可供下载。我已经使用了代码

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
$output = fopen('php://output', 'w');
fwrite($output, $html);
fclose($output);

但是下载不会自动开始...我必须使用firebug打开POST请求链接,以便启动下载..可能有什么问题?

4

2 回答 2

1

也许您需要做的只是通过 AJAX 调用返回文件的路径,然后使用 JavaScript 通过以下方式之一“启动”下载 -

  • window.open
  • window.location.href
$.ajax({
  url:"php/test.php",
  type: 'POST',
  dataType: 'json',
  data: { totalQuery : test1, },

  success: function(response){
    // initiate download using direct path to file
    window.location.href = response.URL;
  }
});

现在您的test.php文件只需要以 JSON 格式返回下载文件的 URL 路径 -

$filename = 'data.csv';
$path = $_SERVER['DOCUMENT_ROOT'].'/downloads/';
echo json_encode(array('URL'=>$path.$filename));

您可能会考虑将 URL 作为原始字符串返回 - 但我觉得使用 JSON 可能会更好,因为您可以轻松地将其他信息添加到响应中,而无需额外的解析函数。所有这一切使它成为一个更强大的选择。

于 2012-07-27T09:09:17.523 回答
0

它需要更多参数和 headerinfo:

$file = "data.csv";
$mime_type = "text/csv";
$size = filesize($file);
$name = rawurldecode($name);

@ob_end_clean(); //turn off output buffering to decrease cpu usage

// required for IE, otherwise Content-Disposition may be ignored
if(ini_get('zlib.output_compression'))
    ini_set('zlib.output_compression', 'Off');

header('Content-Type: ' . $mime_type);
header('Content-Disposition: attachment; filename="'.$name.'"');
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');

/* The three lines below basically make the
download non-cacheable */
header("Cache-control: private");
header('Pragma: private');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// multipart-download and download resuming support
if(isset($_SERVER['HTTP_RANGE']))
{
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
    list($range) = explode(",",$range,2);
    list($range, $range_end) = explode("-", $range);
    $range=intval($range);
    if(!$range_end)
    {
        $range_end=$size-1;
    } 
    else
    {
        $range_end=intval($range_end);
    }

    $new_length = $range_end-$range+1;
    header("HTTP/1.1 206 Partial Content");
    header("Content-Length: $new_length");
    header("Content-Range: bytes $range-$range_end/$size");
} 
else
{
    $new_length=$size;
    header("Content-Length: ".$size);
}

/* output the file itself */
$chunksize = 1*(1024*1024); //you may want to change this
$bytes_send = 0;
if ($file = fopen($file, 'r'))
{
    if(isset($_SERVER['HTTP_RANGE']))
        fseek($file, $range);

    while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length))
    {
        $buffer = fread($file, $chunksize);
        print($buffer); //echo($buffer); // is also possible
        flush();
        $bytes_send += strlen($buffer);
    }
    fclose($file);
} 
else 
    die('Error - can not open file.');
于 2012-07-27T09:24:30.243 回答