php 实现下载apk
实现PHP下载APK文件的方法
通过PHP实现APK文件下载功能,关键在于正确设置HTTP头部信息并处理文件流。以下是具体实现方式:
基本文件下载实现
$file_path = '/path/to/your/app.apk';
$file_name = 'app.apk';
if (file_exists($file_path)) {
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.android.package-archive');
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
flush();
readfile($file_path);
exit;
} else {
http_response_code(404);
die('File not found');
}
处理大文件下载
对于较大的APK文件,建议使用分块读取方式避免内存问题:

$file = fopen($file_path, 'rb');
while (!feof($file)) {
print(fread($file, 1024 * 8));
flush();
}
fclose($file);
安全注意事项
确保对下载路径进行安全检查,防止目录遍历攻击:

$base_dir = '/secure/download/directory/';
$requested_file = $_GET['file'] ?? '';
$file_path = realpath($base_dir . $requested_file);
if (strpos($file_path, $base_dir) !== 0 || !file_exists($file_path)) {
http_response_code(403);
die('Access denied');
}
增加下载统计功能
可以在文件下载时记录下载次数或用户信息:
// 记录下载日志
file_put_contents('download.log', date('Y-m-d H:i:s').' - '.$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND);
// 或者更新数据库
$pdo->prepare("UPDATE downloads SET count = count + 1 WHERE file_id = ?")
->execute([$file_id]);
处理断点续传
支持HTTP Range请求实现断点续传功能:
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
$size = filesize($file_path);
list(, $range) = explode('=', $range);
list($start, $end) = explode('-', $range);
$start = max(0, (int)$start);
$end = min($size - 1, empty($end) ? ($size - 1) : (int)$end);
header('HTTP/1.1 206 Partial Content');
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: " . ($end - $start + 1));
$fp = fopen($file_path, 'rb');
fseek($fp, $start);
while (!feof($fp) && ($p = ftell($fp)) <= $end) {
echo fread($fp, min(1024 * 8, $end - $p + 1));
flush();
}
fclose($fp);
exit;
}
以上方法提供了从基础到高级的APK文件下载实现方案,可根据实际需求选择适合的方式。






