我正在使用Codeigniter的内置上传库。这些是我的上传设置:
$config['upload_path'] = upload_path() . 'incoming_faxes/';
$config['allowed_types'] = 'xml|pdf';
$config['file_name'] = uniqid('fax-' . time() . '-', true) . '.xml';
$this->load->library('upload', $config);
确实有效。返回的数据如下,但file_name
附加了下划线:
Array
(
[file_name] => fax-1377114300-521518bca7c5a7.65243756_.xml
[file_type] => application/xml
[file_path] => /var/www/vhosts/example.org/httpdocs/uploads/incoming_faxes/
[full_path] => /var/www/vhosts/example.org/httpdocs/uploads/incoming_faxes/fax-1377114300-521518bca7c5a7.65243756_.xml
[raw_name] => fax-1377114300-521518bca7c5a7.65243756_
[orig_name] => fax-1377114300-521518bca7c5a7.65243756_.xml
[client_name] => Sample.xml
[file_ext] => .xml
[file_size] => 84.69
[is_image] =>
[image_width] =>
[image_height] =>
[image_type] =>
[image_size_str] =>
)
如何在将文件上传到服务器之前删除下划线?
答案 0 :(得分:3)
$fn = uniqid('fax-' . time() . '-', true);
$filename = preg_replace('/\./','_', $fn) . '.xml';
应该这样做。
测试:
$parts = explode('.', $filename);
$ext = array_pop($parts);
$filename = array_shift($parts);
foreach ($parts as $part)
{
if ( 1==1)
{
$filename .= '.'.$part.'_';
}
else
{
$filename .= '.'.$part;
}
}
$filename .= '.'.$ext;
echo $filename;//fax-1377117024-52152360903ae2_02709878.xml
看起来正在发生的事情是Upload.php中的_prep_filename()
方法会针对展开的文件名检查allowed_types
和mimes_types
。文件名中的句点将扩展名之前的最后一个数字(示例文件名中为65243756)拆分为parts
数组。然后,它会针对allowed_types
和mimes_types
检查此值。无法在allowed_types
或mimes_types
中找到该号码,它会附加下划线。
这是一个奇怪的问题。有关详细信息,请参阅此处:https://github.com/EllisLab/CodeIgniter/issues/1380
打破它:
// system/core/libraries/Upload.php
// line 984
protected function _prep_filename($filename)
{
if (strpos($filename, '.') === FALSE OR $this->allowed_types == '*')
{
return $filename;
}
$parts = explode('.', $filename);
$ext = array_pop($parts);
$filename = array_shift($parts);
foreach ($parts as $part)
{
if ( ! in_array(strtolower($part), $this->allowed_types) OR $this->mimes_types(strtolower($part)) === FALSE)
{
$filename .= '.'.$part.'_';
}
else
{
$filename .= '.'.$part;
}
}
$filename .= '.'.$ext;
return $filename;
}
给定文件名fax-1377114300-521518bca7c5a7.65243756.xml
,就会发生这种情况。
$parts = explode('.', $filename);
这会将$filename
分解为包含3个值的数组:
print_r($parts); //Array ( [0] => fax-1377119574-52152d561f4694 [1] => 21065888 [2] => xml )
下一行......
$ext = array_pop($parts);
pop
是$parts
数组:
print_r($parts); //Array ( [0] => fax-1377119706-52152dda0205e5 [1] => 29551151 )
下一行......
$filename = array_shift($parts);
shift
数组:
print_r($parts); //Array ( [0] => 39795691 )
现在$parts
只包含一个项目:39795691
。
现在运行
foreach ($parts as $part)
{
if ( ! in_array(strtolower($part), $this->allowed_types) OR $this->mimes_types(strtolower($part)) === FALSE)
{
$filename .= '.'.$part.'_';
}
else
{
$filename .= '.'.$part;
}
}
检查$parts
中的任何值(请记住,在这种情况下,我们只有一个项目39795691
)是allowed_types
还是{{1}数组。由于它是一个数字而不在任何一个数组中,它将该部分连接到mime_types
变量并附加下划线。