我刚开始遇到的时候,我将文件推送到标题下载。
现在它运作得很好。但是,只要我的某个文件名称中包含“(”或“)”,推送就不起作用。
// 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 = 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)) . '"')
}
}
答案 0 :(得分:0)
我在application/config/config.php
:
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-()';
请参阅字符串末尾的()
。
答案 1 :(得分: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