Rename pdf file to be downloaded on fly

2019-03-21 16:17发布

Given: All the uploaded pdf files on server are prefixed with timestamps. Later user can download these files again. These (ugly)filenames would never change again on server.

Question: When I give the option to download PDF file, name of the file looks ugly and lengthy. How can I change this name to something sensible, so that when user downloads this file, name doesn't look weird?

Do I need to make a copy, since renaming the original file is not an option? Wouldn't it be extra overhead for each downloadable file? Obviously deleting the copied file would be another extra step?

Is it possible to rename file once file is completely downloaded on client side?

What do you guys suggest?

标签: php file rename
5条回答
孤傲高冷的网名
2楼-- · 2019-03-21 16:31

I was doing something similar a while ago, serving files through php (in my case, not to rename them, but to check that the person downloading them was logged in and was allowed to see those files). I found that pdf downloads didn't work in IE unless I also added these headers:

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');

I'm not sure why. Experiment and see what happens.

查看更多
何必那么认真
3楼-- · 2019-03-21 16:35

The filename of the content served is defined in the HTTP headers. Look around the PHP page on headers (also the comments) for more info.

查看更多
▲ chillily
4楼-- · 2019-03-21 16:37

Something like this:

<?php
// We'll be outputting a PDF  
header('Content-type: application/pdf');

// It will be called downloaded.pdf  
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf  
readfile('original.pdf');
?> 
查看更多
女痞
5楼-- · 2019-03-21 16:38

I needed to do this for a recent project and was a bit confused on how to implement, but figured it out shortly after seeing Klaus's answer. To further elaborate on Klaus' response:

1) Create a file called, say, "process.php". Modify Klaus's code so that it accepts two parameters: the original filename and the new name. My process.php looks like:

<?php
$file = $_GET['file'];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename='.$_GET['newFile']);
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

2) Create a link on your user-facing page that points to the processor script:

<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>
查看更多
我只想做你的唯一
6楼-- · 2019-03-21 16:41

You need to set the desired filename in the Content-Disposition header:

$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');

But unfortunately this won't be picked up by a certain webbrowser developed by a team in Redmond. If you want to get it to work in that browser as well, then you need to append the very same filename as last part of the request path. For example: http://example.com/pdf/desiredname.pdf.

查看更多
登录 后发表回答