Перейти к содержимому


Автоматический импорт файлов


Сообщений в теме: 22

#1 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 10:49

Друзья, вновь приветствую всех!

Есть скрипт, который позволяет вручную импортировать в КБ данные из определенного файла. Неудобство в том, что это все приходится делать вручную, открывать, выбирать файл, нажимать на кнопочку. А как известно, айтишники очень ленивые люди, и каждый день делать одну и ту же операцию очень напрягает.

Можно ли организовать автоматически(по расписанию, один раз в день в 8 утра, например) захват файла из определенного каталога, и если, операция импорта пройдет успешно, то переместить этот файл в другой каталог?

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Март 2014 - 11:03

Для автоматических заданий по расписанию у нас есть встроенный cron. В том числе туда можно добавить и функцию автоимпорта.

#3 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 11:37

Не совсем подходит стандартный импорт, поскольку исходный файл с данными далеко не csv и импортируется по определенным правилам. Будем городить функцию, которая будет сканировать каталог на наличие файлов. Если есть программисты, подскажите пожалуйста, в сторону какой функции копать?

#4 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 11:47

Хм... Руководства говорят что открыть файл можно так:
$file = fopen("c:/www/html/file.txt","r");

Но вот ведь вопрос... Это в том случае, когда мы знаем, что наш файл называется "file.txt". Что делать в том случае, если:
1. Мы не знаем как наш файл называется, но он один в каталоге
2. Мы не знаем как наш файл называется, и их в нужном каталоге больше чем один, как взять по очереди каждый из них

Ну и останется после этот файл переместить в каталог с "отработанными" файлами.

#5 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 11:54

А этой командой мы можем просканировать папку на наличие в ней файлов:

<?php
if ($handle = opendir('/path/to/files')) {
    echo "Дескриптор каталога: $handle\n";
    echo "Файлы:\n";
    /* Именно этот способ чтения элементов каталога является правильным. */
    while (false !== ($file = readdir($handle))) {
	    echo "$file\n";
    }
    closedir($handle);
}
?>

Программисты? В правильном направлении двигаюсь???

#6 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 12:08

А вот теперь совершенно непонятно... Сейчас у меня в отображении стоит форма:

<form action="report.php?id=24" method="post" enctype="multipart/form-data">
		 <label for="file">Выберите файл:</label>
	    <input type="file" name="file" id="file" />
	    <br /> <br /> <br />
	    <input style="width:200px; height:50px"  type="submit" name="submit" value="Загрузить" />
</form>

А в подготовке данных:
if ($_FILES['file']['name'] != "") {
echo "<h4>Информация о загруженном на сервер файле: </h4>";
echo "<b>Оригинальное имя загруженного файла: ".$_FILES['file']['name']."</b><br />";
echo "<b>Mime-тип загруженного файла: ".$_FILES['file']['type']."</b><br />";
echo "<b>Размер загруженного файла в байтах: ".$_FILES['file']['size']."</b><br />";
$filename = iconv("CP1251", "UTF-8", $_FILES['file']['tmp_name']);
echo "<b>Временное имя файла: ".$filename."</b><br />";
$kodeF = 0;
$y == 1;
$myfile = gzfile($_FILES['file']['tmp_name']);

Как? Как в автомате его грузить? :(

#7 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 12:14

Получилось как-то так... Проверьте пожалуйста, кто нибудь?
<?php
if ($handle = opendir('/path/to/files')) {
    echo "Дескриптор каталога: $handle\n";
    echo "Файлы:\n";
    /* Именно этот способ чтения элементов каталога является правильным. */
    while (false !== ($file = readdir($handle))) {
		    echo "$file\n";
$filenew = fopen("c:/moya_papka/".$file,"r");
$myfile = gzfile ($filenew);
// тут дальше обработка файла пойдет

// вопрос: теперь отработанный файл надо переместить в каталог c:/moya_papka/well/
    }
    closedir($handle);
// Если есть еще файлы, то по порядку будут браться дальше по циклу
}
?>


#8 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 12:21

В итоге получилось что-то такое:
<?php
if ($handle = opendir('c:/moya_papka/')) {
    echo "Дескриптор каталога: $handle\n";
    echo "Файлы:\n";
    while (false !== ($file = readdir($handle))) {
		    echo "$file\n";
// открываем файл для работы с ним
$filenew = fopen("c:/moya_papka/".$file,"r");
// распаковываем файл
$myfile = gzfile ($filenew);
// тут дальше обработка файла пойдет

// перемещаем отработанный файл в c:/moya_papka/well/
move_uploaded_file("c:/moya_papka/".$file, "c:/moya_papka/well/".$file);
    }
    closedir($handle);
// Если есть еще файлы, то по порядку будут браться дальше по циклу
}
?>


#9 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Март 2014 - 12:28

Сама КБ то у вас где лежит? Если в интернете, то она не сможет прочитать файлы с локального диска "c:". Если версия локальная - то должно работать, если конечно вы нигде не ошиблись в коде.

#10 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 12:38

Сама КБ лежит на локальном сервере.

#11 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 12:42

Не получилось. Файл не обработался, и не скопировался в папку well. Помогите пожалуйста, что не так?

#12 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 13:25

Решил проблемы. Все таки перемещать файл надо функцией или оператором (не знаю как правильно это называется, я не программист):

rename("с:/moya_papka/".$file, "c:/moya_papka/well/".$file);

Вторая проблема была в том, что распакованный файл был вовсе не распакованным:
// распаковываем файл
$myfile = gzfile ($filenew);
Тобишь не находился файл, который мы бы хотели распаковать, потому что это:
// открываем файл для работы с ним
$filenew = fopen("c:/moya_papka/".$file,"r");
давало нам фиг понять что... Поэтому эту строку мы вообще ликвидировали.

В итоге, решение выглядит так:
if ($handle = opendir('c:/moya_papka/')) {
    echo "Дескриптор каталога: $handle\n";
    echo "Файлы:\n<br />";
    while (false !== ($file = readdir($handle))) {
		    echo "file - $file\n <br />";
// распаковываем файл
$myfile = gzfile ("f:/distr/auto_ssod/".$file);
// тут дальше идет обработка файла, импорт его значений в поля КБ.

// перемещаем отработанный файл в c:/moya_papka/well/
rename("c:/moya_papka/".$file, "c:/moya_papka/well/".$file);
    }
    closedir($handle);
// Если есть еще файлы, то по порядку будут браться дальше по циклу
}
Интересно, что в любом случае, строка
echo "file - $file\n <br />";
Дает результат:

Цитата

file - .
file - ..
file - BACKUP05032014.gz
Т. е. Первые два файла видит с названием "." и "..".
Уважаемые программисты, подскажите почему так? И как может обойти это?

#13 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 13:57

Радости айтишника нет предела!!! Все-таки автоматизация это круто!!!!

#14 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Март 2014 - 14:19

Цитата

Все таки перемещать файл надо функцией или оператором rename

Да, это универсальный оператор для перемещения/переименования файлов. Функция move_uploaded_file предназначена только для загруженных через форму файлов (что-то вроде безопасного режима).

Цитата

fopen давало нам фиг понять что...

Функция fopen возвращает ссылку на файл для дальнейшего чтения/редактирования (в зависимости от опций). Не совсем понял в чем проблема у вас ним. Для распаковки (если нужна была она), он естественно не годится. Также, для прямого чтения можно использовать file_get_contents, он возвращает непосредственно содержимое файла.

Цитата

Первые два файла видит с названием "." и "..".
Уважаемые программисты, подскажите почему так? И как может обойти это?

Это 2 стандартных для файловой системы псевдонима для текущей и родительской папки. Обойти разумеется можно обычным if оператором.

#15 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 14:47

Понял. Благодарю Вас!!!

Скажите, а
$data['Имя файла'] = $file;
Разьве не должно было в поле, наименование которого "Имя файла" - добавить название файла, равное $file?

У меня почему-то при выполнении ничего не произошло.

#16 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 06 Март 2014 - 14:49

Разобрался. Надо было пользовать еще
insert_query($data,"НАЗВАНИЕ КАТЕГОРИИ");
unset($data);


#17 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 07 Март 2014 - 07:02

Друзья, а как крон настроить чтобы это представление выполнял в 8 утра?..

#18 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 07 Март 2014 - 09:21

Просмотр сообщенияdolphin (07 Март 2014 - 07:02) писал:

а как крон настроить чтобы это представление выполнял в 8 утра?..

В документации есть ссылка на правила задания расширенного режима.

#19 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 07 Март 2014 - 09:54

ну это понятно, а в поле "Команда" что писать????

#20 dolphin

    Активный участник

  • Пользователи
  • PipPipPip
  • 341 сообщений

Отправлено 07 Март 2014 - 09:55

Из описания следует:

Цитата

Команда — Php код, который будет выполняться по расписанию.
Ииии?... У меня то целое представление должно выполняться!!!





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных