PHP эхо-содержимое файла - PullRequest
1 голос
/ 02 июля 2011

У меня есть файл PDF, который находится в корне моей веб-страницы. Я хочу передать файл в ../cvs своим пользователям, используя php.

Вот код, который у меня есть, софар:

header('Content-type: application/pdf');

$file = file_get_contents('/home/eamorr/sites/eios.com/www/cvs/'.$cv);
echo $file;

Но когда я вызываю эту php-страницу, ничего не печатается! Я хотел бы просто передать сохраненный файл PDF, имя которого в $cv (например, $cv = 'xyz.pdf').

Ответ ajax на эту страницу PHP возвращает текст pdf (gobbldy-gook!), Но мне нужен файл, а не gobbldy-gook!

Надеюсь, это имеет смысл.

Большое спасибо заранее,


Вот AJAX, который я использую

$('#getCurrentCV').click(function(){
    var params={
        type: "POST",
        url: "./ajax/getCV.php",
        data: "",
        success: function(msg){
            //msg is gobbldy-gook!
        },
        error: function(){

        }
    };
    var result=$.ajax(params).responseText;
});

Я бы хотел, чтобы пользователю было предложено загрузить файл.

Ответы [ 4 ]

11 голосов
/ 02 июля 2011

Не используйте XHR (Ajax), просто сделайте ссылку на скрипт, подобный приведенному ниже.Заголовки HTTP, выводимые сценарием, будут инструктировать браузер загружать файл, поэтому пользователь не будет уходить с текущей страницы.

<?php
// "sendfile.php"

//remove after testing - in particular, I'm concerned that our file is too large, and there's a memory_limit error happening that you're not seeing messages about.
error_reporting(E_ALL);
ini_set('display_errors',1);

$file = '/home/eamorr/sites/eios.com/www/cvs/'.$cv;

//check sanity and give meaning error messages
// (also, handle errors more gracefully here, you don't want to emit details about your
//  filesystem in production code)
if (! file_exists($file)) die("$file does not exist!");
if (! is_readable($file)) die("$file is unreadable!");

//dump the file
header('Cache-Control: public'); 
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="some-file.pdf"');
header('Content-Length: '.filesize($file));

readfile($file);

?>

Затем упростите свой JavaScript:

$('#getCurrentCV').click(function(){
     document.location.href="sendfile.php";
});
2 голосов
/ 02 июля 2011

Похоже, вы пытаетесь передать PDF пользователю для загрузки через AJAX.

То, что вы хотите сделать, это использовать AJAX для подтверждения существования файлов и обеспечения безопасности, если таковые имеются, затем просто использовать js, чтобы перенаправить браузер на URL этих файлов, или в этом случае URL-адрес сценария php, доставляющего файл pdf. Когда ваш браузер получает заголовок pdf, он не будет пытаться перенаправить саму страницу, а запрашивает загрузку или какие-либо настройки браузера пользователя.

Что-то вроде: (JS)

window.location.href = http://example.com/getApdf.php?which=xyz

(PHP)

if( !isset( $_GET['which'] ) ) die( 'no file specified' );
if( !file_exists( $_GET['which'] . '.pdf' ) ) die( 'file doesnt exist');

header('Content-type: application/pdf');

readfile( $_GET['which'] . '.pdf' );
2 голосов
/ 02 июля 2011

Я пытаюсь предложить пользователю загрузить файл PDF.

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

Используйте код @ timdev и укажите туда пользователя, например,

location.href = "scriptname.php";
2 голосов
/ 02 июля 2011

Как насчет использования readfile вместо этого?При условии, что файл существует, это должно работать.Убедитесь, что ваш веб-процесс имеет разрешение на чтение каталога и файла.На странице readfile есть пример, который также устанавливает некоторые заголовки.

...