2015-06-30 2 views
0

У меня есть webapp, который имитирует терминал. Каждая команда размещена с помощью AJAX, используя следующий сценарий (часть):

AJAX/Jquery

$.post("sec/cmd_process.php", { n : n }) 
    .done(function(data){ 
     output.append(display(data)); 
    }); 

Если пользователь download log в терминал, следующий сценарий - на sec/cmd_process.php выполняется:

PHP

if(isset($_POST['n'])){ 

    echo $_POST['n']; 
    $t = explode(' ', $_POST['n']); 

    if(strtolower($t[0])=='download'){ 
     if(!isset($t[1])) shout_error("No download specified"); 

     //Download Log 
     elseif($t[1]=='log'){ 
      $stmt = $dbh->prepare("SELECT * FROM `tap_log` ORDER BY `time`"); 
      $stmt->execute(); 
      $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
      foreach($rows as $row) { 
       $user = user_by_id($row['user']); 
       $data.= "{$row['time']} - User {$user['id']} ({$user['name1']} {$user['name2']}) - {$row['information']} ({$row['subject']})".PHP_EOL; 
      } 

      $handle = fopen('log.txt','w+'); 
      fwrite($handle, $data); 
       $path = 'log.txt'; 
       header('Content-Transfer-Encoding: binary'); 
       header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($path)).' GMT'); 
       header('Accept-Ranges: bytes'); 
       header('Content-Length:'.filesize($path)); 
       header('Content-Encoding: none'); 
       header('Content-Disposition: attachment; filename='.$path); 
       readfile($path); 
      fclose($handle); 
     } 
    } 
} 

Что я хочу сделать для сгенерированного файла, log.txt, загружается через диалог «Сохранить как ...». Этот код работает, если вы непосредственно посещаете страницу PHP с этими заголовками, но как я могу заставить ее работать через jQuery/AJAX?

+0

Загрузка Force невозможна через ajax, AFAIK – Varun

+0

Есть ли альтернатива? – Ben

+0

Либо прямая переадресация на PHP, либо навязчивое решение создает скрытый '', где href перенаправляет пользователя на страницу PHP, и вы можете принудительно загрузить его. – Varun

ответ

0

Самое простое решение, которое я нашел в том, чтобы вернуть <script> тег переадресации местоположение в исправительно загрузки страницы:

<script type='text/javascript'> 
    location.href='sec/download.php?file=log.txt&type=text'; 
</script> 

сек/cmd_process.php

$handle = fopen('log_'.time().'.txt','w+'); 
fwrite($handle, $data); 
    echo "Please wait while the file downloads..."; 
    echo "<script type='text/javascript'>location.href='sec/download.php?file=log.txt&type=text';</script>"; 
fclose($handle); 

сек /download.php

<?php 
    $filename = $_GET['file']; 
    $filetype = $_GET['type']; 
    header("Content-Transfer-Encoding: binary"); 
    header("Last-Modified: ".gmdate('D, d M Y H:i:s',filemtime($filename))." GMT"); 
    header("Accept-Ranges: bytes"); 
    header("Content-Length: ".filesize($filename)); 
    header("Content-Encoding: none"); 
    header("Content-Type: application/$filetype"); 
    header("Content-Disposition: attachment; filename=$filename"); 
    readfile($filename); 
Смежные вопросы