2013-09-19 4 views
0

Где я столкнулся сначала, когда я нажал файл в заголовок, чтобы загрузить его.«(» или «)« специальный символ для PHP/CodeIgniter?

Теперь все работает отлично. Однако, если у одного из моих файлов есть «(» или «)» в имени, нажатие не работает.

// 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 ('(', '\ (', $ название);

Это, кажется, не работает Теперь я пытался по крайней мере избавиться от «(», чтобы увидеть, если моя заменить функции на самом деле реагирует на «(» характер. Так что я хотел бы просто удалить из строки.

$ NewString = str_replace («(», ' ', $ name);
echo $ newstring;

Теперь, что странно, так это то, что ничего не делает. Еще более странно, когда я это сделать:

$ имя = 'тест (ола;
$ NewString = str_replace ('(', '', $ название);
эхо $ NewString;

Это на самом деле работает

Это где я получу $ название:

$ имя = конец ($ this-> uri-> сегменты);

Итак, кажется, что мой сегмент 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)) . '"') 
    } 
} 
+0

Что делает 'var_dump (конец ($ this-> uri-> сегменты))' выходной? –

+0

"string 'test'l ( ol.txt' (length = 17)" Hmm interesting ... Обновление: str_replace ('l (', '', $ name) действительно работает. Однако еще не для загрузки. Это то же самое, что и пространство, я должен избегать его, а не удалять его. – nkmol

ответ

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 
+0

Спасибо, я действительно могу заменить строку :) Но она по-прежнему отказывается загружать файл. Я понятия не имею, почему я должен избегать этого персонажа. Попробовал заменить его кодом Html, который он мне дал раньше: ( Но это также дало мне черный экран: S – nkmol

+0

Обновление: Мой путь "shared \ test \ test (2) .txt" Не проходит: 'if (is_file ($ path)) {} ' Это опять происходит только с символом" ("или") "в названии/пути. – nkmol

+0

Обновление обновления: я пробовал такое же декодирование с помощью моего пути. Теперь я удалил «(» и «)» в пути. в сочетании с именем файла, он, как представляется, регистрирует файл: S (даже когда я поставил test2.txt). Какая странность, но это сработало! :) Огромное спасибо! – nkmol

0

Сделайте одну вещь, которую я только что наткнулся на аналогичной проблемой, в вашем application/config/config.php:

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

См. () в конце строки.

+0

Это сработало для вас? –

+0

Извините, я должен был сказать это в своем посте. Когда эта конфигурация установлена, вы получаете сообщение об ошибке: «Обнаружена ошибка Введенный вами URI имеет запрещенные символы». Я уже скорректировал конфигурационный файл :) – nkmol

+0

О, вы уже это сделали? –

Смежные вопросы