<?php
$file_name = $_GET[u];
$file_dir = "";
$rename = '新名称'.'.mp3';
if (!file_exists($file_dir . $file_name)) { //检查文件是否存在
echo "文件不存在";
exit;
} else {
// 一下是php文件下载的重点
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Content-Type: application/force-download");
Header("Content-Disposition: attachment; filename=" . $rename);
Header("Accept-Length: ".filesize($file_dir . $file_name));
@readfile($file_dir.$file_name);//加@不输出错误信息

?>我这个代码现在路径有个问题。
就是xxx.com/index.php?u=a/123.mp3 这样就可以下载
但是 xxx.com/index.php?u=/a/123.mp3 就总说文件不存在前面加了个“/”就不行。
请问如何弄两种方式都可以啊?

解决方案 »

  1.   

    $file_name = trim($_GET[u], '/');
      

  2.   

    $file_dir = dirname() . '/';开头加了/会被认为是绝对路径,解决办法就是在前面增加当前的绝对路径。另外LZ的做法不安全,如果在生产环境中使用,可能导致客户端下载任意文件。
      

  3.   

    简单点 对$file_name 做个过滤不就行了.
      

  4.   


    file_exists($_SERVER["DOCUMENT_ROOT"].$file_dir . $file_name)
      

  5.   

    这里你可以对$_GET[u]进行处理嘛,这样不就得了?
      

  6.   

    $filename = $_GET['u'];
    if (!file_exists())
    {
    $filename = dirname . '/' . $filename;
    }
      

  7.   

    打错了:
    $filename = $_GET['u'];
    if (!file_exists($filename))
    {
    $filename = dirname . '/' . $filename;
    }