使用PHP开始下载而不显示文件URL

时间:2014-09-26 17:54:23

标签: php url download

我想用PHP开始下载,但我不希望用户知道正在下载的文件的URL。

我在StackOverflow中已经阅读了很多答案,但我找到的所有答案都显示了下载文件的URL。

以下是我想要做的事情,例如:

这是PHP文件,用户将看到此网址:http://website.com/download.php

这是下载文件的网址,我不希望用户看到此网址:http://website.com/file.zip

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:0)

这取决于你想隐藏什么。 URL将永远显示给用户,但如果您不希望用户知道发送了哪些参数(或值),您可以对它们进行编码并通过AJAX通过POST请求发送它们。

答案 1 :(得分:0)

试试这个:

    $file = './file.zip';
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); //<<< Note the " " surrounding the file name
    header('Content-Transfer-Encoding: binary');
    header('Connection: Keep-Alive');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));

答案 2 :(得分:0)

在渲染页面之前,存储下载url somwhere(例如在会话中)并生成一些唯一的哈希值,稍后您可以使用它来识别应下载的文件:

$SESSION['file_download']['hash'] = md5(time) . '_' . $userId; // lets say it equals to 23afg67_3425
$SESSION['file_download']['file_location'] = 'real/path/to/file';

当渲染展示用户跟随下载网址时:

http://yourdomain.com/download_file.php?hash=23afg67_3425

如果用户点击它,您将文件发送给用户,但只允许这一次或在当前会话期间。我的意思是你应该创建一个名为download_file.php的新源文件,其中包含以下内容:

if ($_GET['hash'] == $SESSION['file_download']['hash']) {
  // send file to user by outputing the file data to browser
    $file = $SESSION['file_download']['file_location'];

    header('Content-Description: File Transfer')
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);

  // optionaly reset $SESSION['file_hash'] so that user can not download again during current session, otherwise the download with generated link will be valid until user session expires (user closes the browser)
} else {
  // display error message or something
}