PHP文件下载后无法读取

PHP文件下载后无法读取,php,encoding,header,byte-order-mark,Php,Encoding,Header,Byte Order Mark,嗨,我有一个脚本,可以创建一个文件并将其存储在服务器上。该文件以UTF-8编码,是cmap软件的一种xml文件 如果我直接从服务器打开文件,那么就没有问题,可以读取文件 当用户转到特定url时,我强制下载此文件。下载后,cmap软件无法读取该文件。我必须进入我的文本编辑器(notepad++),将编码从UTF-8更改为不带BOM的UTF-8 我是否发送了错误的标题?php在下载该文件时是否对其进行了处理 如果您对此有任何建议,我们将不胜感激 干杯 德鲁 编辑 很抱歉,在几个不同的类中涉及到很多代

嗨,我有一个脚本,可以创建一个文件并将其存储在服务器上。该文件以UTF-8编码,是cmap软件的一种xml文件

如果我直接从服务器打开文件,那么就没有问题,可以读取文件

当用户转到特定url时,我强制下载此文件。下载后,cmap软件无法读取该文件。我必须进入我的文本编辑器(notepad++),将编码从UTF-8更改为不带BOM的UTF-8

我是否发送了错误的标题?php在下载该文件时是否对其进行了处理

如果您对此有任何建议,我们将不胜感激

干杯 德鲁

编辑 很抱歉,在几个不同的类中涉及到很多代码。我已包含将文件发送到浏览器时使用的代码:

function exportCMAP()
{   
    $serializer = new Serializer();
    $serializer->serializeCmap();

    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=export.cxl");
    header("Content-Type: x-cmap/text-xml");
    header("Content-Transfer-Encoding: binary");

    readfile("temp/export.cxl");
}
如果需要生成xml的代码(使用XMLWriter),我也可以发布

编辑

根据要求,以下是生成xml的代码-它位于另一个类中:

        function serializeCmap()
    {

        $storeManager = new StoreManager();         
        $linkedNodes = $storeManager->getLinkedNodes();

        $namespaces = Array();

        $writer = new XMLWriter();

        $writer->openMemory();
        $writer->setIndent(4); 

        $writer->startDocument('1.0', 'utf-8');

            $writer->startElement('cmap');

                $writer->writeAttribute('xmlns', 'http://cmap.ihmc.us/xml/cmap/');
                $writer->writeAttribute('dc', 'http://purl.org/dc/elements/1.1/');

            $writer->startElement('res-meta');

                $writer->writeElement("dc:title", "Full schema for Cmap");
                $writer->writeElement("dc:description", "Description Goes Here");

            $writer->endElement();  

            $writer->startElement('map');

                $writer->startElement('concept-list');

                    foreach($linkedNodes['nodes'] as $node=>$id) {

                        $writer->startElement('concept');

                            $writer->writeAttribute("id", $id);
                            $writer->writeAttribute("label", $node);

                        $writer->endElement();
                    }

                $writer->endElement();

                $writer->startElement('linking-phrase-list');

                    foreach($linkedNodes['phrases'] as $phrase=>$id) {

                        $writer->startElement('linking-phrase');

                            $writer->writeAttribute("id", $id);
                            $writer->writeAttribute("label", $phrase);

                        $writer->endElement();
                    }

                $writer->endElement();

                $writer->startElement('connection-list');

                    foreach($linkedNodes['connections'] as $key=>$val) {

                        $writer->startElement('connection');

                            $writer->writeAttribute("from-id", $val['from']);
                            $writer->writeAttribute("to-id", $val['phrase']);

                        $writer->endElement();

                        $writer->startElement('connection');

                            $writer->writeAttribute("from-id", $val['phrase']);
                            $writer->writeAttribute("to-id", $val['to']);

                        $writer->endElement();
                    }

                $writer->endElement();

            $writer->endElement();

        $writer->endElement();

        $writer->endDocument();

        file_put_contents("temp/export.cxl",$writer->outputMemory());
    }

您应该添加两个重要内容:

  • 测试HTTP头是否尚未发送,以及
  • 确保输出不超过
    readfile
    中的一个
  • 所以试试这个:

    function exportCMAP() {
        if (headers_sent()) {
            // HTTP header has already been sent
            return false;
        }
        // clean buffer(s)
        while (ob_get_level() > 0) {
            ob_end_clean();
        }
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=export.cxl");
        header("Content-Type: x-cmap/text-xml");
        header("Content-Transfer-Encoding: binary");
        readfile("temp/export.cxl");
        // avoid any further output
        exit;
    }
    

    您需要显示一些源代码。您需要显示更多的源代码。:)即代码创建
    export.cxl
    非常感谢,成功了!我今天花了大约4个小时来解决这个问题!我试着检查是否发送了头,但这不是问题所在——是干净的缓冲区解决了问题。我不知道实际的问题是什么,但我真的很高兴它现在起作用了。您是否建议在发送文件下载时始终包含该代码?您救了我一天!由于某种原因,我的图片被命名为UTF-8,并且前面有一个标签,这就解决了所有问题!谢谢