php 下载apk实现
实现PHP下载APK文件
使用PHP下载APK文件需要设置正确的HTTP头信息,确保浏览器识别文件类型并触发下载。以下是一个简单的实现方法:
<?php
$file = 'path/to/your.apk'; // APK文件路径
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.android.package-archive');
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);
exit;
} else {
http_response_code(404);
die('File not found');
}
?>
安全注意事项
确保对文件路径进行验证,防止目录遍历攻击。可以使用realpath()和basename()函数:

$baseDir = '/safe/directory/';
$requestedFile = basename($_GET['file']); // 从URL获取文件名
$file = realpath($baseDir . $requestedFile);
if ($file === false || strpos($file, $baseDir) !== 0) {
die('Invalid file');
}
大文件下载优化
对于大文件,使用分块读取可以降低内存消耗:

$chunkSize = 1024 * 1024; // 1MB chunks
$handle = fopen($file, 'rb');
while (!feof($handle)) {
echo fread($handle, $chunkSize);
ob_flush();
flush();
}
fclose($handle);
使用CDN或云存储
对于高流量场景,建议将APK文件托管在CDN或云存储服务(如AWS S3、阿里云OSS),然后通过PHP生成预签名URL:
// 示例:生成AWS S3预签名URL(需要AWS SDK)
$s3Client = new Aws\S3\S3Client([/* 配置 */]);
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'your-bucket',
'Key' => 'path/to/file.apk'
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string)$request->getUri();
header("Location: $presignedUrl");
下载统计跟踪
如果需要记录下载次数,可以在文件传输前更新数据库:
// 记录下载日志
$stmt = $pdo->prepare("UPDATE apk_downloads SET count = count + 1 WHERE apk_id = ?");
$stmt->execute([$apkId]);
以上方法提供了从基础实现到高级优化的完整方案,可根据实际需求选择适合的方式。






