检查文件扩展名或MIME类型失败

时间:2014-06-10 作者:ReynierPM

我需要检查上传的文件是否.csv.txt 作为扩展,我的做法如下:

$uploadfiles = $_FILES[\'uploadfiles\'];

echo \'<pre>\';
var_dump($uploadfiles);
echo \'</pre>\';

if (is_array($uploadfiles)) {
    foreach ($uploadfiles[\'name\'] as $key => $value) {
        if ($uploadfiles[\'error\'][$key] == 0) {

            $filetmp = $uploadfiles[\'tmp_name\'][$key];
            $filename = $uploadfiles[\'name\'][$key];

            $filetype = wp_check_filetype(basename($filename), null);
            $filetitle = preg_replace(\'/\\.[^.]+$/\', \'\', basename($filename));
            $filename = $filetitle . \'.\' . $filetype[\'ext\'];
            $upload_dir = wp_upload_dir();

            if ($uploadfiles[\'type\'] != "text/csv" || $uploadfiles[\'type\'] != "text/plain") {
                echo "Error, the file $filename has not a valid extension: " . $filetype["ext"];
                continue;
            }

            echo "entre";die();

            $i = 0;
            while (file_exists($upload_dir[\'path\'] . \'/\' . $filename)) {
                $filename = $filetitle . \'_\' . $i . \'.\' . $filetype[\'ext\'];
                $i++;
            }

            $filedest = $upload_dir[\'path\'] . \'/\' . $filename;

            if (!is_writeable($upload_dir[\'path\'])) {
                $this->msg_e(\'Unable to write to directory %s. Is this directory writable by the server?\');
                return;
            }

            if (!move_uploaded_file($filetmp, $filedest)) {
                $this->msg_e("Error, the file $filetmp could not moved to : $filedest ");
                continue;
            }
        }
    }
}
但我一直在犯这样的错误:

错误,文件Aruba Airlines票券(截止2014年4月27日)-Aruba Airlines票券。csv没有有效的扩展名:csv

我还使用以下代码进行测试:

if ($filetype[\'type\'] != "text/csv" || $filetype[\'type\'] != "text/plain") {
    echo "Error, the file $filename has not a valid extension: " . $filetype["ext"];
    continue;
}
结果是一样的。如果我这样做:

echo \'<pre>\';
var_dump($uploadfiles);
echo \'</pre>\';
结果是:

array (size=5)
  \'name\' => 
    array (size=1)
      0 => string \'Aruba Airlines tickets-coupons (through 27-Apr-2014) - Aruba Airlines tickets-coupons .csv\' (length=90)
  \'type\' => 
    array (size=1)
      0 => string \'text/csv\' (length=8)
  \'tmp_name\' => 
    array (size=1)
      0 => string \'/tmp/php53tzhZ\' (length=14)
  \'error\' => 
    array (size=1)
      0 => int 0
  \'size\' => 
    array (size=1)
      0 => int 14084526
那么错误在哪里呢?

Checking for compared values types

因此,根据这里一位成员的建议,我这样做了:

echo \'<pre>\';
print_r($uploadfiles);
echo \'</pre>\';

// this is the only key since I\'m uploading 
// just one file for that I check in [0]     
echo gettype($uploadfiles[\'type\'][0]); 

// output: string
然后:

echo gettype($filetype[\'type\']);

// output: string
然后:

if ($filetype[\'type\'] != $fileCSV || $filetype[\'type\'] != $fileText) {
    echo "Error, the file $filename has not a valid extension: " . $filetype["ext"];
    continue;
}
还是会犯同样的错误,这让我抓狂!

3 个回复
SO网友:ReynierPM

找到我出错的地方,条件是,我的代码是:

if ($filetype[\'type\'] != $fileCSV || $filetype[\'type\'] != $fileText) {
    echo "Error, the file $filename has not a valid extension: " . $filetype["ext"];
    continue;
}
右边是这个:

if (!in_array($filetype[\'type\'], array($fileCSV, $fileText))) {
    echo "Error, the file $filename has not a valid mimetype: " . $filetype["type"];
    continue;
}

SO网友:Eric Mayfield

这只是一个想法,并不能保证一定会奏效,但根据我过去的经验,我遇到了字符串在定义为“string”和“string”之间的问题。

我注意到,在数组输出中,它显示为“text/csv”,其中的“text/csv”。同样,这可能不是问题所在,但我认为值得一试。

通读你的代码,从逻辑上看,一切似乎都很紧凑。

您甚至可以将文件类型设置为变量,这样您就不必反复键入这些变量,因为大多数代码编辑器都会建议/自动填充变量。您永远不知道何时将支持更多类型或创建新引用。

尝试将其设置为这样的$fileCSV=\'文本/csv\'$fileText=\'文本/普通\';然后在条件语句中替换它。

if ($filetype[\'type\'] != $fileCSV || $filetype[\'type\'] != $fileText) {

SO网友:Abhineet Verma

你为什么不使用Wordpress的内置功能呢。

选中文件类型,从文件名中检索文件类型。

如果需要,可以选择定义mime数组。

<?php wp_check_filetype( $filename, $mimes ) ?>
检查文件类型(&H);扩展名尝试确定文件的实际文件类型。

如果无法,将使用文件扩展名来确定类型。如果确定扩展名与文件的实际类型不匹配,则;“正确的\\u文件名”;值将使用正确的文件名和扩展名进行设置。

 <?php
      $validate = wp_check_filetype_and_ext( $file, $filename, $mimes );

      if( $validate[\'proper_filename\'] !== false )
          $filename = $validate[\'proper_filename\'];
 ?> 
参考号:

http://codex.wordpress.org/Function_Reference/wp_check_filetype

http://codex.wordpress.org/Function_Reference/wp_check_filetype_and_ext

结束

相关推荐

上传的图像不在/Uploads文件夹中

网站存在巨大问题。我更新了主题以使用帖子缩略图(这是多么旧),然后在尝试上载图像以用作特色缩略图时:图像会处理/压缩,但URL会导致404。网站没有任何异常。htaccess。实际上没有wp content/uploads目录,所以我做了一个,chmod权限是0755,所以这不应该是问题所在。我将“媒体设置”文件夹重置为默认文件夹,但该文件夹中不会出现任何图像。编辑:将上载文件夹更改为0777权限似乎可以解决此问题。这样保留权限安全吗?