0

ファイルをヘッダーにプッシュしてダウンロードしているときに最初に出くわした場所。

今では問題なく動作します。ただし、ファイルの名前に「(」または「)」が含まれていると、プッシュが機能しません。

// required for IE
        if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); }

        // Build the headers to push out the file properly.
        header('Pragma: public');     // required
        header('Expires: 0');         // no cache
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($path)).' GMT');
        header('Cache-Control: private',false);
        header('Content-Type: application/octet-stream');  // Add the mime type from Code igniter.
        header('Content-Disposition: attachment; filename="'.basename($name).'"');  // Add the file name
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: '.filesize($path)); // provide file size
        header('Connection: close');
        readfile($path); // push it out
        exit();

exit() を実行するだけで、黒いページが表示されます。今、これは私が逃げなければならないキャラクターだと思いました。私はそれをエスケープしようとしました:

str_replace('(', '\(', $name);

これはうまくいかなかったようです。今、少なくとも「(」を取り除こうとして、置換関数が実際に「(」文字に反応するかどうかを確認しました。そのため、単に文字列から削除したかったのです。

$newstring = str_replace('(', '', $name);
echo $newstring;

これについて奇妙なのは、何もしないように見えることです。さらに奇妙なのは、私がこれを行うときです:

$name = 'test(ol';
$newstring = str_replace('(', '', $name);
echo $newstring;

それは実際に機能します!

これは私が $name を取得する場所です:

$name = end($this->uri->segments);

私のUriセグメントはオブジェクトか何かのようですが、少なくとも実際の文字列としては機能しませんか?

私が十分に明確だったことを願っています。前もってありがとう、Nkmol。

テキスト名の例:

テスト(2)

関数

function download()
{
    $this->load->helper('download');
    $path = ''; //default waarde

    //zet de uri segments in een array
    $aPath = $this->uri->uri_to_assoc(3);

    //zet de segment array om in een nieuwe path, zo word de current directory gesaved in een variable
    //de laast segment hoeft geen "/" achter, laaste segment van de volledige url
    $i = 0;
    $len = count($aPath);

    foreach($aPath as $key => $value) :
        if ($i == $len - 1)
        {
            $path .= $key .  DIRECTORY_SEPARATOR . $value;
        }
        else
        {
            $path .= $key .  DIRECTORY_SEPARATOR . $value .  DIRECTORY_SEPARATOR;
        }
        $i++;
    endforeach;

    $pathEdit = substr($path, -1);
    if($pathEdit == '/' || $pathEdit == '\\')
    {
        $path = substr_replace($path,"", -1);
    }


    //$data = file_get_contents($path); // Read the file's contents
    $name = end($this->uri->segments); //haal de file naam op(laaste segment in de uri)
    //echo $blub;
    $this -> push_file($path, $name);

    //force_download($name, $data);
}

function push_file($path, $name)
{
    // check of het een path is en niet een folder
    if(is_file($path))
    {
        // required for IE
        if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); }

        // Build the headers to push out the file properly.
        header('Pragma: public');     // required
        header('Expires: 0');         // no cache
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($path)).' GMT');
        header('Cache-Control: private',false);
        header('Content-Type: application/octet-stream');  // Add the mime type from Code igniter.
        header('Content-Disposition: attachment; filename="'. basename($name).'"');  // Add the file name
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: '.filesize($path)); // provide file size
        header('Connection: close');
        readfile($path); // push it out
        exit();

        //str_replace('"', '\\"', basename($file)) . '"')
        //str_replace('(', '\(', basename($file)) . '"')
    }
}
4

2 に答える 2

0

で、同様の問題に遭遇したばかりのことを1つ実行してくださいapplication/config/config.php

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-()';

()文字列の末尾にある を参照してください。

于 2013-09-19T13:43:09.473 に答える
0

出力から、var_dumpファイル名が HTML エンティティとして保存されているように見えます。を使用html_entity_decode()して、実際のファイル名を取得できます。ファイル名を取得したら、str_replace()前に試みたように文字列に対して実行できます。

$name = end($this->uri->segments);
$name = html_entity_decode($name);
$newstring = str_replace('(', '', $name);
//convert it back to HTML entities if necessary
于 2013-09-19T13:52:40.290 に答える