2

こんにちは、ファイルを作成してサーバーに保存するスクリプトがあります。このファイルは 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");
}

(XMLWriter を使用して) xml を生成するコードが必要な場合は、それも投稿できます。

編集

ここで要求されているのは、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());
    }
4

1 に答える 1

3

次の 2 つの重要事項を追加する必要があります。

  1. HTTP ヘッダーがまだ送信されていないかどうかをテストし、
  2. の 1 つ以上の出力がないことを確認して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;
}
于 2010-04-18T17:04:02.273 に答える