I have a form that submits to a php script which I would like to do the following:
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:
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