【问题标题】:if(in_array) mime check always returns FALSEif(in_array) mime 检查总是返回 FALSE
【发布时间】:2013-08-13 06:08:51
【问题描述】:

变量:

$csvFile = $_FILES['uploadfile']['tmp_name'];
$csvFile = $con->real_escape_string($csvFile);
$mimes = array('application/vnd.ms-excel','text/plain','text/csv','text/tsv','csv');

if声明:

if(in_array($csvFile, $mimes))
{
$file = fopen($csvFile, 'r');
$i = 0;
$row = 1; 
while (($line = fgetcsv($file)) !== FALSE) 
{
if($row == 1){ $row++;  continue; }
$data_array[$i] = $line[0];
$data_array[$i] = mysqli_real_escape_string($con, trim($data_array[$i]));
$encrypted_numbers[$i] = encryption::encrypt($data_array[$i]);
$encrypted_numbers[$i] .= mysqli_real_escape_string($con, trim($line[1]));
$i++;
}
fclose($file);
} 
else 
{
die("Sorry, file type not allowed");
};

我已经尝试了 30 分钟,有人知道为什么即使文件名为 csv.csv,我总是会出错吗?

【问题讨论】:

  • in_array 调用之前的 var_dump($csvFile) 给你什么?
  • 很可能 $csvFile 会给你实际的文件名,而不是你试图用 in_array 做的那个文件的 mime 类型。
  • @Maximus2012 字符串(26) "D:\\xampp\\tmp\\phpAC6.tmp"
  • @user2671532 当您尝试将其与 $mimes 匹配时,这将始终导致 in_array 返回 false。
  • @Maximus2012 我意识到这一点,我尝试让 csvFile 没有临时名称,然后将其内爆,即使 var_dump 给了我“csv.csv”名称,它仍然是错误的

标签: php arrays csv if-statement


【解决方案1】:
$_FILES['uploadfile']['tmp_name'];

您应该查看“类型”而不是“tmp_name”

$_FILES['uploadfile']['type'];

但是,有一个 SO discussion here 关于为什么 csv 文件可以具有 application/octet-stream mime 类型。它建议您需要自己验证文件类型,而不是依赖['type']。最好的方法是使用fgetcsv() 尝试将其解析为 csv。如果失败,则假设它不是 csv。

【讨论】:

  • 发生完全相同的事情
  • 打印或回显 ['type'] 以查看它是什么。
  • 应用程序/八位字节流
  • 表示它是一个二进制文件。它真的是一个csv吗?在 Notepad++ 或类似工具中打开它。文件名不是 something.csv.csv 或者可能是 csv.csv.txt 是吗?
  • 名称为“csv.csv”,在OpenOffice.org Calc中制作并保存为“CSV文件”,文件下方为“CSV文件”
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2021-06-24
  • 2011-05-07
相关资源
最近更新 更多