我正在制作一个PHP脚本,它将下载一个名称和版本的文件。这些文件将存储在服务器上,如下所示:
/dl/Project1/1.0.txt
/dl/Project1/1.1.txt
/dl/Project2/2.3.jar
/dl/Project2/2.3.1.jar
检索此类文件的路径如下所示:
download.php?name=Project1&type=txt&version=1.0
download.php?name=Project1&type=txt&version=1.1
download.php?name=Project2&type=jar&version=2.3
download.php?name=Project2&type=jar&version=2.3.1
实际下载文件时会出现问题。在这个例子中,我希望前两个文件都下载为Project1.txt,我希望最后两个文件下载为Project2.jar。如何暂时重命名这些以使其正常工作?
答案 0 :(得分:6)
发送定义文件名称的标题。
$filename = $name . "." . $type;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
我已经添加了其他标题,因为您也应该发送这些标题。这只是您可以see in the PHP documentation on readfile
的修改示例。
答案 1 :(得分:2)
你不需要重命名它,你只需要更改标题中的名称,就有脚本:
<?php
// Check is set all params
if (isset($_GET['name'], $_GET['type'], $_GET['version'])) {
// Get the params into variables.
// Secure replace to avoid the user downloading anyfile like @Kristian Antonsen said.
// Replace all '..' to a single '.';
$name = preg_replace('/[\.]{2,}/', '.', trim($_GET['name']));
// Replace any strange characters.
$type = preg_replace('/[^A-Za-z0-9]/', '', trim($_GET['type']));
// Replace any letter and strange character.
$version = preg_replace('/[^0-9\.]/', '', trim($_GET['version']));
/**
* Check is all the params filled with text
* and check if the version is in the right format.
*/
if (!empty($name) &&
!empty($type) &&
!empty($version) &&
preg_match('/^[0-9](\.[0-9])+$', $version)) {
/**
* Get the file path, here we use 'dirname' to get the absolute path
* if the download.php is on root
*/
$filePath = dirname(__FILE__) . '/dl/' . $name . '/' . $version . '.' . $type;
// Check if the file exist.
if (file_exists($filePath)) {
// Add headers
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=' . $name . '.' . $type);
header('Content-Length: ' . filesize($filePath));
// Read file
readfile($filePath);
} else {
die('File does not exist');
}
} else {
die('Missing params');
}
}
答案 2 :(得分:0)
您可能只想使用content-disposition标头:
header('Content-disposition: attachment; filename=Project1.txt');
readfile('Project1/1.0.txt');