我正在建立一个门户,用户可以在其中收听、上传或下载 mp3 文件,但下载选项仅在用户之前将 mp3 文件上传到服务器时才可用(尚未实现)。
我在 mysql 表中有一个字段(名为“descargas”),用于跟踪用户在上传(将字段值递增 1)或下载 mp3 文件(将字段值递减 1)后的可用下载。我还使用会话变量 ($_SESSION['descargas']) 来跟踪可用下载。
上传部分很好,但下载部分有一个小问题:我需要以某种方式告诉 php,如果用户在对话框出现时选择不下载文件,则不应用减 1。
我正在使用 php 的强制下载方法(但使用 POST 方法,而不是用于修复的官方 GET 方法),其中一个单独的下载文件位于与 mp3 文件相同的目录中,我当前的问题是用户的可用下载量将被减一,即使他们选择不继续下载。
另一个问题是,即使可用下载量等于 0,用户仍然会看到保存对话框,并且可以在单击其链接后下载任何文件。
这是下载文件:
<?php
session_start();
if (!isset($_POST['file_name']) || empty($_POST['file_name'])) {
session_destroy();
exit();
}
if(isset($_POST['file_name'])) {
$file = basename($_POST['file_name']);
$size = filesize($file);
$user=$_SESSION['usuario'];
$conexion4=mysqli_connect('localhost','usuariomusica2','1MusicUser1','musica2');
$sentencia12=mysqli_query($conexion4, "update musica2.usuarios set descargas=descargas-1 where usuario='$user' and descargas > 0");
$sentencia13=mysqli_query($conexion4, "select * from musica2.usuarios where usuario='$user'");
$row=mysqli_fetch_array($sentencia13);
$_SESSION['descargas']=$row[5];
// Definir headers
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
header('Content-Type: audio/mpeg3');
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $size);
// Descargar archivo
readfile($file);
}
else {
die('El archivo no existe.');
}
?>
任何想法,将不胜感激。如果我必须采取完全不同的路线并使用 javascript 和/或 ajax 实现下载部分以便我可以解决我的问题,我会这样做。
P:SI 还注意到,当单击主页上任何给定歌曲的标签时,浏览器的 URL 永远不会更改为“download.php”,这是处理下载的 php 页面的名称,即使页面正在被访问。