gpt4 book ai didi

php - Codeigniter上传在文件名中添加下划线

转载 作者:行者123 更新时间:2023-12-04 04:44:46 25 4
gpt4 key购买 nike

我正在使用 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] =>
)

如何在文件上传到服务器之前删除下划线?

最佳答案

$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

看起来正在发生的事情是 _prep_filename() Upload.php 中的方法检查 allowed_typesmimes_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 中或 mime_types数组。由于它是一个数字并且不在这两个数组中的任何一个中,因此它将该部分连接到 $filename 中。变量并附加下划线。

关于php - Codeigniter上传在文件名中添加下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18366354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com