【问题标题】:fopen returns empty in phpfopen 在 php 中返回空
【发布时间】:2019-03-06 06:00:13
【问题描述】:

我正在尝试读取一个 CSV 文件,该文件的单元格中的值由逗号分隔。

这是我的代码:-

if (($handle  = fopen($file_name['files']['tmp_name'], 'r')) !== FALSE) {
       while ($row  = fgetcsv($handle)) {
              echo '<pre>';
              print_r($row);
       }
}

有时它可以完美运行。但有时当我编辑 CSV 并添加一些示例值(或从上面复制粘贴一些以前的值)时,fopen 不起作用。它不返回任何东西。它只是空的。

如果我将 csv 文件恢复到以前的状态,它仍然可以工作,或者如果我输入单个值而不是多个值,它仍然可以工作,但不适用于以逗号分隔的单元格中的值。

另外,如果我在 csv 中使用管道运算符而不是逗号,它仍然可以正常工作(这样做只是为了测试)。但我只想在 csv 中使用逗号分隔符。

另外,我正在从请求中获取文件。如果我使用本地存储中的文件,它可以正常工作。但是当我上传它然后尝试阅读它时,它就不起作用了。

如果我 var_dump fopen() 我得到 FALSE。

我看到了一些与此相关的问题,但没有任何效果。谁能帮帮我?

【问题讨论】:

  • 上传的字段大小是多少?
  • 可以有 1 到 10 个值,以逗号分隔。我有两列分隔包含用逗号分隔的字段
  • 这些字段也是第一列有单位或双位数字,第二列有单、双或三字母的数字。所有这些都在各自的列中用逗号分隔。
  • 对不起,我的意思是输入 file,而不是字段。 PHP中的最大文件上传大小会干扰您上传的文件吗?您是否尝试过 var_dumping 整个 $_FILES 数组?
  • var_dumping 整个 $_FILES 数组看起来不错,但是当我 echo fopen 时,它只是空白。文件的大小可能很大。我正在上传产品列表,因此可以有很多产品,例如 100,000 或 1,000,000 5 t0 7 列。

标签: csv magento-1.9 fopen php-5.5


【解决方案1】:

函数 fopen() 只会在出错时返回 FALSE。

看来您的文件实际上是刚刚上传的。您应该首先将其从$_FILES 中的位置移动到另一个位置,或者将其完全加载到内存中(不推荐)。由于在大多数 Linux 操作系统上,上传的文件都存储在 /tmp 中,因此 PHP 无法保证该文件将用于长时间运行的脚本。

所以移动文件然后打开它。 您还可以检查文件是否实际上是 CSV。有两件事要看:

  1. 使用file_exists()检查文件是否确实存在

  2. 检查 MIME 类型 这并不能保证文件的格式完全正确

    $csv_mimetypes = array(
        'text/csv',
        'text/plain',
        'application/csv',
        'text/comma-separated-values',
        'application/excel',
        'application/vnd.ms-excel',
        'application/vnd.msexcel',
        'text/anytext',
        'application/octet-stream',
        'application/txt',
    );
    if (in_array($_FILES['upload']['type'], $csv_mimetypes)) {
        //MIME Type is correct....
    }
    
  3. 验证格式 这将保证格式。我不会详细介绍,因为有很多方法可以实现。

所有这些都准备好之后,操作fopen() 返回的文件描述符应该没有问题。还要注意fgetcsv() returns NULL if an invalid handle is supplied or FALSE on other errors, including end of file.

【讨论】:

  • 好的。谢谢。有机会我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多