我面对一个我从未做过的案例,我不知道如何正确地做到这一点。
我有一个php脚本,可以为客户端生成文件。在脚本的最后,我echo
简单地为他们下载文件的路径。
如何提供下载文件或路径或任何内容,并确保在下载后删除该文件。
广泛地说,我想让文件仅用于一个/唯一的下载。怎么样?
修改
我无法使用headers
答案 0 :(得分:1)
有一些组件可以让它发挥作用。在不知道您使用哪个框架的情况下,我将使用注释作为占位符。
但是,如果不使用header
函数,则无法执行此操作。
以下是概述流程的文件来源:
<?php
$fileid = $_GET['fileid'];
$key = $_GET['key'];
// find the file in the database, and store it in $file
if ($keyMatches) {
// it is important for security to only use file paths from the database
$actualPath = $file->getPathOnDisk();
$fileInfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($fileInfo, $actualPath);
$fp = fopen($actualPath, 'rb');
header("Content-Type: " . $mime);
header("Content-Length: " . filesize($actualPath));
fpassthru($fp);
}
else
{
http_response_code(403); // forbidden
}
您将通过链接到download.php?fileid=1234&key=foobar
并在生成密钥的同时生成URL并将其存储在数据库中来使用它。
为了安全起见,您将文件保留在Web根目录之外,这意味着无需通过脚本就无法通过Web服务器访问这些文件。
fpassthru
速度相当快,不会对性能产生影响。
答案 1 :(得分:0)
您必须执行下载文件网关,例如download.php?id = XXX
其中XXX是您将存储在DB中的每个文件的唯一ID。当然还有要下载的文件。 然后,每次用户访问该页面时,您都可以: - 检查他是否已下载文件 - 如果不是,则将其重定向到文件的真实路径 - 如果是,则显示403消息。
当用户下载文件时,更新数据库,生成或复制文件为新名称,使用标题,并在下载或暂停后删除文件。