0

Helo 我正在尝试在 PHP 中创建下载脚本...上传表单没问题,它将文件存储在文件夹'upload/'中,但文件名存储在 DB 中,但是当我下载时,它会下载文件,例如一些图像,当我想查看时图像它只是像这里的红色 X:图像....有什么想法吗?

<?php
include 'connect.php';


    $query = "SELECT * FROM topics WHERE topic_id = '". $_GET['topic_id'] ."' ";

    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    $name = $row['topic_subject'];
    $file = $row['topic_file'];


    header('Pragma: public');
    header('Content-Description: File Transfer');
    header("Content-Disposition: attachment; filename='".$file . "'");
    header("Content-Type: ".mime_content_type($file)."");
    header("Content-Length: " . filesize($file) ." ");
    header('Content-Transfer-Encoding: binary');
    readfile('uploads/',$file);
    ob_clean();
    flush();

?>
4

3 回答 3

4

看起来问题可能出在您对readfile. 你需要使用a.来连接文件路径到文件名,所以替换;

readfile('uploads/',$file);

readfile('uploads/'.$file);
于 2013-06-07T12:47:58.127 回答
0

您必须将图像的完整路径提供给 readfile() 函数。

于 2014-05-07T10:13:47.843 回答
0

我正在使用自己的脚本进行文件下载。这是我发现的最好的。您也可以根据用户要求对其进行修改。

function download_file($Source_File, $Download_Name, $file_extension = '') {
    /*
      $Source_File = path to a file to output
      $Download_Name = filename that the browser will see
      $file_extension = MIME type of the file (Optional)
     */
    if (!is_readable($Source_File))
        die('File not found or inaccessible!');

    $size = filesize($Source_File);
    $Download_Name = rawurldecode($Download_Name);

    /* Figure out the MIME type (if not specified) */
    $known_mime_types = array(
        "pdf" => "application/pdf",
        "csv" => "application/csv",
        "txt" => "text/plain",
        "html" => "text/html",
        "htm" => "text/html",
        "exe" => "application/octet-stream",
        "zip" => "application/zip",
        "doc" => "application/msword",
        "xls" => "application/vnd.ms-excel",
        "ppt" => "application/vnd.ms-powerpoint",
        "gif" => "image/gif",
        "png" => "image/png",
        "jpeg" => "image/jpg",
        "jpg" => "image/jpg",
        "php" => "text/plain"
    );

    if ($file_extension == '') {
        //  $file_extension = strtolower(substr(strrchr($Source_File,"."),1));
        if (array_key_exists($file_extension, $known_mime_types)) {
            $mime_type = $known_mime_types[$file_extension];
        } else {
            $mime_type = "application/force-download";
        };
    };

    @ob_end_clean(); //off output buffering to decrease Server usage
    // if IE, otherwise Content-Disposition ignored
    if (ini_get('zlib.output_compression'))
        ini_set('zlib.output_compression', 'Off');

    header('Content-Type: ' . $mime_type);
    header('Content-Disposition: attachment; filename="' . $Download_Name . '"');
    header("Content-Transfer-Encoding: binary");
    header('Accept-Ranges: bytes');

    header("Cache-control: private");
    header('Pragma: private');
    header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));

    // multipart-download and download resuming support
    if (isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2);
        list($range) = explode(",", $range, 2);
        list($range, $range_end) = explode("-", $range);
        $range = intval($range);
        if (!$range_end) {
            $range_end = $size - 1;
        } else {
            $range_end = intval($range_end);
        }

        $new_length = $range_end - $range + 1;
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: $new_length");
        header("Content-Range: bytes $range-$range_end/$size");
    } else {
        $new_length = $size;
        header("Content-Length: " . $size);
    }

    /* output the file itself */
    $chunksize = 1 * (1024 * 1024); //you may want to change this
    $bytes_send = 0;
    if ($Source_File = fopen($Source_File, 'r')) {
        if (isset($_SERVER['HTTP_RANGE']))
            fseek($Source_File, $range);

        while (!feof($Source_File) &&
        (!connection_aborted()) &&
        ($bytes_send < $new_length)
        ) {
            $buffer = fread($Source_File, $chunksize);
            print($buffer); //echo($buffer); // is also possible
            flush();
            $bytes_send += strlen($buffer);
        }
        fclose($Source_File);
    } else
        die('Error - can not open file.');
    die(1); // A response code other than 0 is a failure
}

我希望这能帮到您。

干杯!

穆达萨阿里

于 2014-05-07T10:01:52.650 回答