Добрый день!

Каким образом можно прочитать CSV файл, который находится в сетевой директории? Далее эти данные использовать для создания новых записей в разделе. Версия 7.15.3.1649.

Нравится

4 комментария
static int check(string uid, string type_need, string license_need, ref string[] dataByUid)
		{
 
			// 
			const string SERVER = "SERVER";
			const string USER = "USER";
			const string PASSWROD = "PASSWROD";
 
 
 
			string type = "image";
			string license = "";
 
			long needUidLong = long.Parse(uid);
			//переводим искомый идентификатор в число для применения половинного деления в отсортированной списке
 
			var client = new SftpClient(SERVER, USER, PASSWROD);
			client.Connect();
 
			var dateTime = DateTime.MinValue.ToUniversalTime();
			var needPath = "";
 
			//ищем необходимый файл с последней датой изменения
			foreach (var file in client.ListDirectory("/bridgeman/"))
			{
				if (file.IsDirectory)
				{
					continue;
				}
 
				long fileSizeMb = file.Length / 1024 / 1024;
 
				//проверяем файл на размер больше 1Мб, чтобы исключить ненужные
				if (fileSizeMb < 1)
				{
					continue;
				}
 
				//проверяем дату изменения 
				if (file.LastWriteTimeUtc > dateTime)
				{
					dateTime = file.LastWriteTimeUtc;
					needPath = file.FullName;
				}
			}
 
			//если файл с БД не найден завершаем неудачей
			if (needPath == "")
			{
				client.Disconnect();
				//return false;
				return -1;
			}
 
			//Инициализируем поток чтения файла при помощи StreamReader, чтобы считывать построчно
			StreamReader streamReader = new StreamReader(client.OpenRead(needPath), Encoding.UTF8);
 
			//ограничения промежутка
 
			//начало отрезка
			long startByte = 0;
			//конец отрезка
			long lastByte = streamReader.BaseStream.Length;
			//размер половины отрезка, для отслеживания точки останова цикла
			long halfSize = (lastByte - startByte) / 2;
 
			//текущая позиция проверки (середина отрезка)
			long curCenter = startByte + halfSize;
 
			//перехд на нужную позицию
			streamReader.BaseStream.Position = curCenter;
 
			while (halfSize > 2)
			{
				//очищаем буфер, очень важно, иначе происходит наложение данных
				//баг работы StreamReader по сетевому потоку
				streamReader.DiscardBufferedData();
 
				//считываем сначала битую строку, а потом уже цельную следующую
				streamReader.ReadLine();
				string line = streamReader.ReadLine();
				if (line == null)
				{
					break;
				}
 
				//формируем массив данных
				var tsv = line.Split('\t');
				if (tsv.Length < 1)
				{
					break;
				}
 
				//находим идентификатор
				string curUid = Regex.Replace(tsv[0], @"[^\d]", "");
				if (curUid == "")
				{
					break;
				}
 
				long curUidLong = long.Parse(curUid);	
			}
 
			streamReader.Close();
			client.Disconnect();
 
			return -1;
		}

это для чтения с ftp csv

Dima Avdoshin,

Спасибо за ответ! Подскажите, куда этот код вставить (создать новый Исходный код или в произвольном нужном месте, типа веб-сервис)?

Pavel Litvinovich, все от задачи зависит, лично у нас реализация через сервис была, и мы вызывали этот код на странице редактирования

Dima Avdoshin,

А какой Using надо подключить для SftpClient?

Показать все комментарии

Здравствуйте!

 

Пытаюсь загрузить dll на вкладке "Внешние сборки". После выбора файла вылетает ошибка

Action: Change
ControlId: FileUploadEdit
SubmitAjaxEventConfig: {"config":{"extraParams":{}}}

 

Как можно решить данную проблему?

Прикрепленные файлы

Нравится

3 комментария
Лучший ответ

Елена, причина может быть в следующем:

Из-за системных настроек ограничивающих виды вложений (File extensions DenyList) невозможно к пакету добавить библиотеку — вместо ошибки будет просто текст «ошибка в работе приложения». В логах  при этом также ничего очевидного.

Обходное решение: в справочник «Управление файлами \ Список исключений из проверки безопасности файлов» добавить: «/FileUpload.aspx».

В 7.17 это уже решено.

Елена, причина может быть в следующем:

Из-за системных настроек ограничивающих виды вложений (File extensions DenyList) невозможно к пакету добавить библиотеку — вместо ошибки будет просто текст «ошибка в работе приложения». В логах  при этом также ничего очевидного.

Обходное решение: в справочник «Управление файлами \ Список исключений из проверки безопасности файлов» добавить: «/FileUpload.aspx».

В 7.17 это уже решено.

Надо прописать именно /FileUpload.aspx в справочнике.

Андрей, картинка не грузится. И в чём отличие от того, что написал я?

Показать все комментарии

В версии 7.16.2 был добавлен механизм ограничения форматов загружаемых файлов. Логика жестко зашита для сервисов ImageAPIService и FileApiService. Поскольку данная логика может быть полезна для кастомных сервисов, отвечающих за загрузку файлов, предлагаю доработать базовый механизм так, чтобы можно было расширить текущий список сервисов.

1 комментарий

Добрый день, Артем.

На текущий момент в системе не реализовано API для использования функциональности FileSecurity и вся функциональность описана в ядре, доступ к которому не предоставляется сторонним лицам.
Поэтому встроить эту проверку валидности в кастомный сервис загрузки пока не является возможным.

На текущий момент проверка файлов работает только через системные настройки FileSecurityMode и FileExtensionsDenyList, глобально для всего приложения.

 

Уже зафиксировано пожелание иметь возможность использовать механизм валидации файлов для своих кастомных сервисов.

Показать все комментарии

Здравствуйте,хотелось бы спросить возможна ли загрузка пакетов в поставку которая находиться на облаке.
Я установил VISUAL SVN SERVER и создал хранилище,при нажатии на кнопку Browse,у меня всё корректно открываеться.Добавил хранилище в список хранилищ BPM ONLINE,но при попытке авторизации,авторизация не выполняется,просто идёт загрузка,и позже прерывается
Я думаю причина в том что Поставка на облаке не может подключиться к моему серверу SVN.
В общем,к хранилищу нет доступа из облака(и не только, в принципе нету,если устройства не в одной локалкьной сети,только что с ноутбука (который находился в одной сети с компьютером на котором находиться сервер SVN попробовал получить доступ к хранилищу,и у  меня получилось,затем отключился с локальной сети и раздал интернет с телефона на ноутбук,и снова попробовал подлючиться,теперь хранилище не находит.Хотелось бы узнать верны ли мои догадки,и если это действительно так,узнать решение текущей проблемы

Нравится

3 комментария
Лучший ответ

Тут проблема не в BPM, а в сервере SVN. Он доступен только из локальной сети. Для того, чтобы он был доступен в интернет (тогда BPM в облаке его увидит), необходимо опубликовать его «во внешку» (например http://qaru.site/questions/2575332/is-it-possible-to-set-up-a-personal-svn-remote-repository-which-can-be-accessed-through-the-internet)

Напишите в тех поддержку террасофт и узнайте о возможности работы с svn из вашего облака

Тут проблема не в BPM, а в сервере SVN. Он доступен только из локальной сети. Для того, чтобы он был доступен в интернет (тогда BPM в облаке его увидит), необходимо опубликовать его «во внешку» (например http://qaru.site/questions/2575332/is-it-possible-to-set-up-a-personal-svn-remote-repository-which-can-be-accessed-through-the-internet)

https://academy.terrasoft.ru/documents/technic-sdk/7-13/rekomenduemaya-…

ВАЖНО

Для переноса изменений в промышленную среду не рекомендуется использовать SVN, поскольку такой способ не предусматривает создание резервной копии базы данных. Перенос изменений с помощью SVN следует использовать только для сред разработки.

Для переноса изменений в приложение, размещенное в облаке, рекомендуется использовать возможности пользовательского интерфейса bpm'online. Использование WorkspaceConsole невозможно, поскольку у пользователя нет непосредственного доступа к базе данных облачного приложения.

Показать все комментарии

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

Как теперь сделать чтобы этот файл или скачался или отобразился в новой странице?

Нравится

3 комментария
Лучший ответ

Как то так:

var response = System.Web.HttpContext.Current.Response;
	response.ClearContent();
	response.ContentType = "application/pdf";
	response.AddHeader("Content-Disposition", "inline; filename=" + docName);
	response.AddHeader("Content-Length", docStream.Size);
	response.BinaryWrite((byte[])docStream);
	response.End();

 

Как то так:

var response = System.Web.HttpContext.Current.Response;
	response.ClearContent();
	response.ContentType = "application/pdf";
	response.AddHeader("Content-Disposition", "inline; filename=" + docName);
	response.AddHeader("Content-Length", docStream.Size);
	response.BinaryWrite((byte[])docStream);
	response.End();

 

Григорий Чех,

Благодарю, вот в итоге рабочий код:

var response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", "inline; filename=Ведомость расчетов с клиентом.pdf");
response.AddHeader("Content-Length", f.GetLongLength(0).ToString());
response.BinaryWrite(f);
response.End();

f - это тип byte[]

Рад что у вас получилось smiley

Показать все комментарии

Добрый день. Подскажите пожалуйста как добавить возможность загружать файлы через мобильное приложение.

В академии есть инструкция для настройки embeded детали. Но мне бы хотелось сделать обычную деталь.

Спасибо

Нравится

3 комментария

Здравствуйте.
Что в Вашем понимании "обычная" деталь?
В мобильном приложении есть два типа деталей: встроенные (например, адреса, средства связи и т.д.) и стандартные (Активность в контакте и прочие, сюда же входят детали с редактируемым реестром).
В инструкции на данный момент представлена наиболее удобная для разработчика и пользователя реализация встроенной детали "Файлы и ссылки" из возможных. Пользователь нажимает "Добавить" и может сделать фото с камеры, прикрепить картинку с галереи или добавить файл.
Помимо инструкции можете также посмотреть реализацию данной детали в пакете Mobile.

Добрый день!

Такой возможности, так как не будет тогда работать функционал, который реализован специально для встроенных деталей (сделать фото и т.д.) 

Хочу отметить, что загруженные записи отображаются на страницы записи, а не на отдельной странице - http://prntscr.com/hpzz3r.

Вопрос: чем Вам не подходит встроенная деталь?

В версии bpm'online 7.11.3 добавлена возможность добавить деталь "Файлы и ссылки" в любой раздел мобильного приложения (если для аналогичного раздела деталь существует в основном интерфейсе) через мастер мобильного приложения.

Для этого требуется зайти в мастер мобильного приложения – выбрать раздел – выбрать настройку страницы - добавить встроенную деталь, которая будет ссылаться на соответствующий объект – сохранить настройку - выполнить синхронизацию мобильного приложения.

Показать все комментарии

Добрый день!

Возникла необходимость массовой загрузки файлов.
У нас есть раздел "Проекты", по которым приходят заявки на соответствующую деталь. В каждую заявку крепится скан-копия документа.
Хочется реализовать следующую схему загрузки: пользователь выбирает папку, имя у которой равно названию какого-нибудь проекта. Внутри папки лежат сканы документов, имена файлов соответствуют номерам заявок.
Реализация схемы в общих чертах понятна, есть только вопросы по инструментарию. Для выбора папки есть функция System.SelectDirectory. Есть ли возможность пробежаться по "внутренностям" папки, то есть перебрать файлы по именам, которые в ней лежат?

Да, чуть не забыл, пользуемся Terrasoft CRM 3.3.0.49.

Заранее спасибо!

Нравится

2 комментария

Здравствуйте, Николай!
для работы с файлами-папками используется обьект FSO
его методы-свойства можно найти в гугле (например, тут)

ориентировочный код:

//...
var FSO = GetFileSystemObject()
var _folder = FSO.GetFolder(FolderName);
LoadMaps(_folder)
//..

функции рекурсивные:

/////////////////////////////////////////////////////////////////////
//  Обход по папкам
/////////////////////////////////////////////////////////////////////
function  LoadMaps(_folder) { //debugger;
	//Log.Write(0, 'folder: ' + _folder.Path);	
	LoadMapsFromFolder(_folder);//обработка файлов в папке
	var more_folders = new Enumerator(_folder.SubFolders);
    for (;!more_folders.atEnd();more_folders.moveNext()){   //обход по подпапкам
        OneFolder = more_folders.item();
        LoadMaps(OneFolder);
    }
}
/////////////////////////////////////////////////////////////////////
//  Обход по файлам
/////////////////////////////////////////////////////////////////////
function LoadMapsFromFolder(_folder) {            
 
	var FolderPath = _folder.Path
    var more_files = new Enumerator(_folder.Files);
    for (;!more_files.atEnd();more_files.moveNext()){
		var one_file = more_files.item();	
		//обработка файла
		}
 
	} 
}

+подключите скрипт scr_FileUtils

Ольга,
спасибо большое за ответ! Пойду пробовать.

Показать все комментарии