Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP echo file contents

Tags:

file

php

pdf

I have a pdf file which is located off my webpage's root. I want to serve a file in ../cvs to my users using php.

Here is the code I have sofar:

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

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

But when I call this php page, nothing gets printed! I'd like to simply serve the pdf file stored whose name is in $cv (e.g. $cv = 'xyz.pdf').

The ajax response to this PHP page returns the text of the pdf (gobbldy-gook!), but I want the file, not the gobbldy-gook!

I hope this makes sense.

Many thanks in advance,


Here's the AJAX I'm using

$('#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;
});

I'd like the user to be prompted to download the file.

like image 438
Eamorr Avatar asked Jun 26 '26 06:06

Eamorr


2 Answers

Don't use XHR (Ajax), just link to a script like the one below. The HTTP headers the script outputs will instruct the browser to download the file, so the user will not navigate away from the current page.

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

?>

Then, simplify your javascript:

$('#getCurrentCV').click(function(){
     document.location.href="sendfile.php";
});
like image 74
timdev Avatar answered Jun 28 '26 21:06

timdev


How about using readfile instead? Provided that the file exists, that should work. Make sure your web process has permission to read the directory and the file. There is an example on the readfile page that sets some headers as well.

like image 30
Andrew Avatar answered Jun 28 '26 21:06

Andrew



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!