fopen возвращает пустой в php - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь прочитать 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 Ответ

0 голосов
/ 02 октября 2018

функция fopen() вернет FALSE только при ошибке.

Кажется, что ваш файл на самом деле только что загружен.Сначала вы должны переместить его из местоположения в $_FILES в другое ИЛИ полностью загрузить его в память (не рекомендуется).Поскольку в большинстве ОС Linux загруженные файлы хранятся в /tmp PHP не может гарантировать, что файл будет там для долго выполняющихся сценариев.

Поэтому переместите файл, а затем откройте его. Вы также можете проверить, действительно ли файл является CSV.Есть 2 вещи, которые нужно увидеть:

  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.

...