2013-08-01 5 views
0

У меня есть форма, которая отправляет на PHP скрипт, который я хотел бы сделать следующее:Force загрузить PDF файл на отправить

  1. захват пользовательского ввода с помощью POST (сделано)
  2. отправить мне по электронной почте с данными пользователя (сделано)
  3. начать загрузку PDF из того же каталога, что и файл .php (test.pdf) - ПОМОЩЬ!

EDIT: FYI, я звоню PHP с помощью JQuery:

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

Вот код PHP, который захватывает пользовательский ввод с помощью POST и посылает его мне по электронной почте. Мне просто нужен раздел, который № 3, выше.

<?php 

$email_PGi = "[email protected]"; 
$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); 


?> 

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(); 

?> 
+0

Что вы уже пытались заставить скачать? – MisterBla

+0

взглянуть на этот вопрос/ответ http://stackoverflow.com/questions/3476362/how-to-force-a-file-to-download-in-php – Hmazter

+0

Я пробовал: заголовок ('Content-Type: application/pdf'); header ('Content-disposition: attachment; filename = test.pdf'); readfile ('test.pdf'); ... но я не уверен, что я правильно назову. Ничего не произошло.. – p1xelarchitect

ответ

0

Использование http://php.net/manual/en/function.file-get-contents.php для передачи данных вместе с заголовками, а не ReadFile.

+0

Прошу прощения за kwolfe, хотя это может быть ответ, ни один из приведенных вами примеров не относится к тому, что я пытаюсь сделать (загрузить файл PDF). Можете ли вы показать мне, как вы могли бы использовать это в моем php-скрипте выше? – p1xelarchitect

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); 
+0

Я пробовал этот точный код, и это не сработало. Когда я нажимаю кнопку отправки, мой код jquery (валидация) отлично работает, и я получаю электронная почта от php-скрипта, но не скачать файл .. Помогает ли это знать, что я вызываю php-скрипт через jquery $ .ajax()? – p1xelarchitect

+0

@ p1xelarchitect Как правило, я не верю.Должен был поставить это на ваш вопрос. – MisterBla

+0

Да, 'jQuery.ajax' не может вызвать диалог загрузки файлов в браузере. проверьте это: http://updates.html5rocks.com/2011/08/Saving-generated-files-on-the-client-side – haim770

0

Вы пытались открыть окно, которое заставляет загрузку? Это, вероятно, не лучшее и чистое решение, но оно будет работать.

JQuery:

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

downloadpdf.php файл = 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(); 

Я не уверен, если вы планируете передавая имя файла в функции обратного вызова в дальнейшем.

+0

простите меня, я новичок в php ... это, наверное, глупый вопрос, но каково фактическое имя файла php в вашем примере? "downloadpdf.php"? – p1xelarchitect

+0

Имя файла действительно _downloadpdf.php_, и я передаю имя файла через переменную '$ _GET'. Обратите внимание, что в этом примере предполагается, что ваш pdf-файл находится в той же папке, что и downloadpdf.php. – MisterBla

+0

OK! Ближе ... Я тестировал его в Safari - без кубиков - ничего не происходит. Протестировано в IE9, IE10 и FF - он работает, но попадает в блокировщик всплывающих окон. В любом случае? – p1xelarchitect

1

Это потому, что ответ (с правильными заголовками) принимается с помощью запроса ajax, который не будет выводиться пользователю. Вы можете попробовать одну из трех вещей:

  1. Не используйте для этого ajax.
  2. Используйте API файлов и обработчик ajax обрабатывает данные файла (основная боль).
  3. У меня есть обратный вызов ajax для значения window.location для скрипта, который использует только заголовок Content-Disposition: attachment, чтобы браузер начал «перенаправлять», но вместо этого загружает файл, как указано в заголовке.

Кроме того, возможно дубликат Download a file by jQuery.Ajax

+0

Предполагая, что № 3 - самый простой вариант, можете ли вы дать мне [простой] пример? – p1xelarchitect

+0

'window.location = 'downloadpdf.php? File = test.pdf';' no href – Anthony

Смежные вопросы