0

我有一个提交给我想要执行以下操作的 php 脚本的表单:

  1. 通过 POST 捕获用户输入(完成)
  2. 向我发送一封包含用户详细信息的电子邮件(完成)
  3. 开始从与 .php 文件 (test.pdf) 相同的目录下载 PDF - 帮助!

编辑:仅供参考,我通过 jquery 调用 php:

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

这是通过 POST 捕获用户输入并通过电子邮件发送给我的 php 代码。我只需要上面的#3 部分。

<?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:\n\n";

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

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


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

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


?>

下载pdf.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();

?>
4

4 回答 4

1

这是因为 ajax 请求正在接收响应(带有正确的标头),该请求不会输出给用户。您可以尝试以下三件事之一:

  1. 不要为此使用ajax。
  2. 使用 File API 并让 ajax 回调处理文件数据(主要痛苦)。
  3. 让 ajax 回调将window.location值设置为仅使用Content-Disposition: attachment标头的脚本,以便浏览器开始“重定向”,而是下载标头指示的文件。

此外,可能重复通过 jQuery.Ajax 下载文件

于 2013-08-01T13:55:31.907 回答
0

您是否尝试过打开强制下载的窗口?这可能不是最好也不是最干净的解决方案,但它会起作用。

查询:

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

下载pdf.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();

我不确定您是否打算稍后将文件名传递给回调。

于 2013-08-01T13:51:28.647 回答
0

使用http://php.net/manual/en/function.file-get-contents.php将数据与标题一起发送,而不是读取文件。

于 2013-08-01T13:21:56.047 回答
0

利用:

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);
于 2013-08-01T13:30:05.017 回答