【问题标题】:php readfile bad charsetphp readfile 坏字符集
【发布时间】:2016-05-13 09:10:18
【问题描述】:

我有一个 php 代码,用于根据来自 URL 的 file_id 下载文件。一切都很好,但我在下载扩展名为 .doc 的文件时遇到问题

这是我的代码,我做错了什么?

$file = mysql_fetch_array(mysql_query("SELECT * FROM ".sqlprefix."files WHERE id = '".$_GET['id']."'")); $tmp = explode(".",$file['url']); $tmp = $tmp[计数($tmp)-1]; // $tmp = "doc";

switch ($tmp) {
    case "pdf": $ctype="application/pdf"; break;
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "docx": $ctype="application/vnd.openxmlformats-officedocument.wordprocessingml.document"; break;
    case "doc": $ctype="application/msword"; break;
    case "csv":
    case "xls":
    case "xlsx": $ctype="application/vnd.ms-excel"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
    case "gif": $ctype="image/gif"; break;
    case "png": $ctype="image/png"; break;
    case "jpeg":
    case "jpg": $ctype="image/jpg"; break;
    case "tif":
    case "tiff": $ctype="image/tiff"; break;
    case "psd": $ctype="image/psd"; break;
    case "bmp": $ctype="image/bmp"; break;
    case "ico": $ctype="image/vnd.microsoft.icon"; break;
    default: $ctype="application/force-download";
}

$baseName = basename($file['url_del']);
$fileSize = filesize($file['url_del']);
$url = $file['url_del'];

// $ctype = "application/msword";
// $baseName = "File name with spaces and diacritic ěščěšč.doc"
// $fileSize = "214016"
// $url = "./files/File name with spaces and diacritic ěščěšč.doc";


    header('Content-Description: File Transfer');
    header('Content-Type: '.$ctype);
    header('Content-Disposition: attachment; filename='.$baseName);
    header('Expires: 0');
    header('Pragma: public');
    header('Content-Length: '.$fileSize);
    readfile($url);
    exit;

在word中下载文件后我明白了。

我认为,这个问题一定是在编码中......在此处输入图像描述

【问题讨论】:

    标签: php character-encoding readfile


    【解决方案1】:

    这对我来说也很糟糕。 我在这里找到了解决方案:PHP readfile() causing corrupt file downloads

    试着把这行放在 readfile() 之前:

    //clean all levels of output buffering
    while (ob_get_level()) {
        ob_end_clean();
    }
    

    【讨论】:

    • 我遇到了类似的情况,这为我解决了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多