1С8 пример. Закачиваем только новые файлы на Ftp

Пример организации закачки на сайт только новых файлов через FTP.

Копируя файлы на сайт, хотелось бы закачивать только новые файлы. Просматривается варианта 3 подхода к решению поставленной задачи:

1. Записывать на сайт только файлы, время создания которых старше (позже) чем существующие на сайте

2. Записывать на сайт только файлы, размер которых отличается от существующих на сайте

3. Комбинировать 1-й и 2-й вариант. Записывать на сайт только файлы, время создания которых старше (позже) чем существующие на сайте и размер которых отличается от существующих на сайте.

В примере рассмотрен 2 вариант.

Шаг 1 - создаем массив исходных файлов для закачки на сайт:

мМассивФайловИзображений = НайтиФайлы("C:\Temp", "*.jpg");

Кстати, не удалось получить файлы изображений всех типов (*.jpg, *.png, *.gif) в каталоге используя конструкцию типа:

мМассивФайловИзображений = НайтиФайлы("C:\Temp", "*.[jpgpnggif]");

Шаг 2 - создаем FTPСоединение и заполняем таблицу значений мТЗФайлыНаFTP именами файлов, размерами файлов, и временем изменения.

Шаг 3 - перед копированием файла на сайт запросом к таблице значений мТЗФайлыНаFTP анализируем, закачен уже файл или нет.

Информация о файлах на сайте записывается в таблицу значений мТЗФайлыНаFTP. Область видимости мТЗФайлыНаFTP - модуль.


// таблицы значений 
Перем мТЗФайлыНаFTP;  
Перем мТЗИзображения; 

// массивы
Перем мМассивФайловИзображений; // исходный массив

Функция ПолучитьFTPСоединение() 

    серверFTP = "99.999.999.9";    
    портFTP = 21;
    имяПользователяFTP = "user";
    парольПользователяFTP = "parol"; 
    пассивноеСоединениеFTP = Истина;
    ПроксиFTP = null;
	

    // FTPСоединение(<Сервер>, <Порт>, <ИмяПользователя>, <ПарольПользователя>, <Прокси>, <ПассивноеСоединение>, <Таймаут>) 
     FTP = Новый FTPСоединение(
        серверFTP,
        портFTP,
        имяПользователяFTP,
        парольПользователяFTP,
        ПроксиFTP,
        пассивноеСоединениеFTP
        );

    стрЛог = "";

    каталогFTP = "public_html/components/com_jshopping/files/img_products/";

    FTP.УстановитьТекущийКаталог(каталогFTP);

    // заполнить глобальный массив именами файлов на сайте    
    мТЗФайлыНаFTP = ПолучитьТаблицуФайловНаСайте(FTP);

    Возврат FTP;

КонецФункции

Функция СоздатьТаблицуФайловНаСайте()

    мТЗФайлыНаFTP = новый ТаблицаЗначений;

    //типСтрока = Новый ОписаниеТипов("строка");    
    ТипСтрока = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(200));

    // определим структуру        
    мТЗФайлыНаFTP.Колонки.Добавить("ИмяФайла", ТипСтрока); 
    мТЗФайлыНаFTP.Колонки.Добавить("Размер", Новый ОписаниеТипов("число")); 

    // Надо учитывать, что на сервере файл создается в момент загрузки, 
	// поэтому ВремяИзменения = времени создания на сервере сайта
    мТЗФайлыНаFTP.Колонки.Добавить("ВремяИзменения", Новый ОписаниеТипов("дата")); 

    // индексы
    мТЗФайлыНаFTP.Индексы.Добавить("ИмяФайла,Размер");

    Возврат мТЗФайлыНаFTP;

КонецФункции

Функция ФайлУжеЗакаченРанее(ФайлДляЗакачкиНаFTP_Имя,ФайлДляЗакачкиНаFTP_Размер,ФайлДляЗакачкиНаFTP_ВремяИзменения)

    Запрос = Новый Запрос;

    // объявляем новый обеъкт для организации запроса к таблице значений 
    Запрос.МенеджерВременныхТаблиц  = Новый МенеджерВременныхТаблиц;   

    Запрос.Текст = "
    | // 
    | ВЫБРАТЬ 
    |    ИмяФайла,    
    |    Размер    
    |    //ВремяИзменения    
    |    ПОМЕСТИТЬ ВТ_ФайлыНаFTP
    |   ИЗ &мТЗФайлыНаFTP КАК мТЗФайлыНаFTP    
    |   ГДЕ 
    |        ИмяФайла = &ФайлДляЗакачкиНаFTP_Имя    
    |        И Размер = &ФайлДляЗакачкиНаFTP_Размер    
    |        //И ВремяИзменения < &ФайлДляЗакачкиНаFTP_ВремяИзменения    
    |;              
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ 
    |    *     
    |ИЗ ВТ_ФайлыНаFTP
    |";            
    // передаем ссылку на ТЗ в параметр
    Запрос.УстановитьПараметр("мТЗФайлыНаFTP",мТЗФайлыНаFTP);
    Запрос.УстановитьПараметр("ФайлДляЗакачкиНаFTP_Имя",ФайлДляЗакачкиНаFTP_Имя);
    Запрос.УстановитьПараметр("ФайлДляЗакачкиНаFTP_Размер",ФайлДляЗакачкиНаFTP_Размер);
    //Запрос.УстановитьПараметр("ФайлДляЗакачкиНаFTP_ВремяИзменения",ФайлДляЗакачкиНаFTP_ВремяИзменения);

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Количество() = 0  Тогда     
        ФайлУжеЗакаченРанее = Ложь;
    иначе
        ФайлУжеЗакаченРанее = Истина;
    КонецЕсли;  

    Возврат ФайлУжеЗакаченРанее;

КонецФункции    

Функция ПолучитьТаблицуФайловНаСайте(FTP)

    стрЛог = "";     
    каталогFTP = ""; // каталог FTP уже установлен при соединении
    Маска="*";
    ИскатьВПодкаталогах = Ложь ;
    массивИменФайлов = FTP.НайтиФайлы(каталогFTP, Маска, ИскатьВПодкаталогах) ;    
    мТЗФайлыНаFTP = СоздатьТаблицуФайловНаСайте();

    для каждого  файлFTP  из массивИменФайлов цикл        

        ВремяИзменения = файлFTP.ПолучитьВремяИзменения();
        размер = файлFTP.размер();

        строкаТЗФайлыНаFTP = мТЗФайлыНаFTP.Добавить();
        строкаТЗФайлыНаFTP.ИмяФайла = файлFTP.Имя;
        строкаТЗФайлыНаFTP.Размер = размер;
        строкаТЗФайлыНаFTP.ВремяИзменения = ВремяИзменения;


    КонецЦикла;    

    Возврат мТЗФайлыНаFTP;

КонецФункции

Функция ЗагрузитьФайлыИзображенийНаСайт() 

    FTP = ПолучитьFTPСоединение();        
    каталогFTP = FTP.ТекущийКаталог(); //"public_html/images/vm_tovar/";

    для каждого ФайлИзображения из мМассивФайловИзображений цикл

        ИмяФайлаОткуда = ФайлИзображения.ПолноеИмя;        
        ИмяФайлаКуда   = ФайлИзображения.Имя;                  
        FTP = ЗагрузитьНаFTP(FTP,ИмяФайлаОткуда,каталогFTP,ИмяФайлаКуда);

	КонецЦикла;    
	
	Возврат 0;

КонецФункции

Функция ЗагрузитьНаFTP(соединениеFTP,ИмяФайлаОткуда,каталогFTP,ИмяФайлаКуда)    

    ФайлОткуда = новый Файл(ИмяФайлаОткуда);
    ФайлОткудаРазмер = ФайлОткуда.Размер();
    ФайлОткудаВремяИзменения = ФайлОткуда.ПолучитьВремяИзменения();    
    ФайлУжеЗакаченРанее = ФайлУжеЗакаченРанее(ИмяФайлаКуда,ФайлОткудаРазмер,ФайлОткудаВремяИзменения);

    если ФайлУжеЗакаченРанее тогда        
        Возврат соединениеFTP;            
    КонецЕсли;

    номерПопытки = 0;

    Попытка
        соединениеFTP.Записать(ИмяФайлаОткуда, ИмяФайлаКуда);                
    Исключение
        номерПопытки = 1;
        стрЛог = "Попытка:" + номерПопытки + ".  Не удалось скопировать на ftp! ЗагрузитьНаFTP() файлы:" + ИмяФайлаОткуда 
        + " -> " + ИмяФайлаКуда + Символы.ПС + ОписаниеОшибки();                    
        Сообщить(стрЛог);        
    КонецПопытки;    

    Если  номерПопытки = 1 тогда
        Попытка
            соединениеFTP = ПолучитьFTPСоединение();
            соединениеFTP.Записать(ИмяФайлаОткуда, ИмяФайлаКуда);                
        Исключение
            номерПопытки = 2;
            стрЛог = "Попытка:" + номерПопытки + ".  Не удалось скопировать на ftp! ЗагрузитьНаFTP() файлы:" + ИмяФайлаОткуда 
            + " -> " + ИмяФайлаКуда + Символы.ПС + ОписаниеОшибки();                    
            Сообщить(стрЛог);        
        КонецПопытки;    
    КонецЕсли;    

    возврат соединениеFTP;

КонецФункции

Функция Закачать()
	
	// Получить массивФайлов для закачки
	мМассивФайловИзображений = НайтиФайлы("C:\Temp", "*.jpg");	
	ЗагрузитьФайлыИзображенийНаСайт()
	
КонецФункции

Закачать();

Изменяем размер изображения или картинки COM - объектом WIA

Скачать пример ftpexample.rar.

Замечания пишите на J008@J008.ru




Рекламный блок:

Предлагаем решение Ваших задач 1С.

Внедрение 1С:

Доработка и сопровождение 1С:

Ориентировочная стоимость работ программиста 1С : 500 р. за 1 час работы.

Пишите: j008@j008.ru

Звоните: 8 916 710 83 51 Ольга