提交后强制pdf文件下载

I have a form that submits to a php script which I would like to do the following:

  1. capture the user input via POST (done)
  2. send me an email with the user's details (done)
  3. start downloading a PDF from the same directory as the .php file (test.pdf) - HELP!

EDIT: FYI, I am calling the php via jquery:

$.ajax({
    type: "POST",
    url: php_url,
    data: $('#popForm').serialize(),
            success: function(){
           window.location.href = 'downloadpdf.php?file=test.pdf';
        }
    })

Here is the php code that captures the user input via POST and sends it to me via email. I just need a section that does #3, above.

<?php

$email_PGi = "me@mail.com";
$email_subject = "some email subject";


$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 

$email_message = "The following is a new message received via the website:

";

function clean_string($string) {
  $bad = array("content-type","bcc:","to:","cc:","href");
  return str_replace($bad,"",$string);
}

$email_message .= "First Name: ".clean_string($firstname)."
";
$email_message .= "Last Name: ".clean_string($lastname)."
";


// create email headers
$headers = 'From: '.$biz_email."
".
'Reply-To: '.$biz_email."
" .
'X-Mailer: PHP/' . phpversion();

@mail($email_PGi, $email_subject, $email_message, $headers);


?>

downloadpdf.php

<?php

$file = $_GET['file'];
header('Content-Type: Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Length: ' . $file);
readfile($filename);
die();

?>

Use http://php.net/manual/en/function.file-get-contents.php to send the data along with your headers, not readfile.

Use:

define('PDF_FILE', 'test.pdf');

header('Content-Type: application/pdf');
header("Content-Transfer-Encoding: Binary");
header("Content-Disposition: attachment; filename=" . basename(PDF_FILE));
header('Expires: 0');
header('Content-Length: ' . filesize(PDF_FILE));

ob_clean();
flush();

readfile(PDF_FILE);

Have you tried opening a window that forces the download? This is probably not the best nor cleanest solution, but it'll work.

JQuery:

$.ajax({
    type: "POST",
    url: php_url,
    data: $('#popForm').serialize(),
    success: function()
    {
       window.location.href = 'downloadpdf.php?file=test.pdf';
    }
});

downloadpdf.php?file=test.pdf

$file = $_GET['file'];
header('Content-Type: Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Length: ' . $file);
readfile($filename);
die();

I'm not sure if you plan on passing the filename to the callback later on.

It's because the response (with correct headers) is being received by the ajax request, which isn't going to output to the user. You can try one of three things:

  1. Don't use ajax for this.
  2. Use File API and have the ajax callback handle the file data (major pain).
  3. Have the ajax callback set the window.location value to a script that only uses the Content-Disposition: attachment header so that the browser starts to "redirect" but instead downloads the file as indicated by the header.

Also, possible duplicate of Download a file by jQuery.Ajax