AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.12.2021, 13:04   #1  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
DAX09 Как проверить файл JPEG на валидность через Net?
Привет всем. Подскажите, есть такой код который читает файл jpeg и делает из него jpeg поменьше - т.е. миниатюру.

X++:
try
{
	image = System.Drawing.Image::FromFile(path + filenameExt, false); // <-- ошибка тут
	bitmap = new System.Drawing.Bitmap(image, #widthtsize, #heightsize);
	graphics = System.Drawing.Graphics::FromImage(bitmap);
	graphics.DrawImage(image, #widthtsize, #heightsize);
	bitmap.Save(path + filenameExtPreview);
	image = null;
}
catch (Exception::CLRError) 
{
	error("......");
}


Если файл filenameExt - ломанный, ошибка:
Ошибка вызова статического метода ClrObject.

Вложил в try и добавил исключение Exception::CLRError - не ловит.
Прихожу к выводу что надо какой-то спец. метод Net на проверку валидности изображения. Но такого нет.
Либо есть какой то другой способ?
Подскажите.
Старый 10.12.2021, 13:13   #2  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
А если в .NET такой файл указанным методом открыть - какой эксепшен кидается? OutOfMemoryException?
Старый 10.12.2021, 13:49   #3  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Да, срабатывает это исключение
Старый 10.12.2021, 14:21   #4  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от oleggy Посмотреть сообщение
Вложил в try и добавил исключение Exception::CLRError - не ловит.
Подскажите.
а без уточнения типа исключения ловит?
catch
{
error("......");
}
Старый 13.12.2021, 04:59   #5  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Это первое что я проверил когда столкнулся с этой проблемой.
К сожалению не ловит.
Поэтому и пришел к выводу что может как то можно проверить каким либо отдельным методом Net. на валидность. Но такового я не нашел.
Может в новых Net это и есть, но у меня DAX09 там Net 2.0.5...

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

Последний раз редактировалось oleggy; 13.12.2021 в 05:28.
Старый 13.12.2021, 06:08   #6  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Судя по обсуждениям вроде https://stackoverflow.com/questions/...file-is-a-jpeg нормально пути проверить нет.
Там есть проверка небольших мета-данных, но если надо убедиться что файл не сломанный, а не просто "не является jpeg", то это скорее всего не поможет. А тогда рекомендуют загрузить файл и обработать эксепшен
Думаю, в общем виде эта проблема решается только полным парсингом джпега. Возможно, можно найти какую-то стороннюю библиотеку, которая загружает джпег с другим исключением (или даже с возвратом boolean успеха). Ну или можно написать её самому (сделать в библиотеке нормальный .NETовский перехват эксепшена и в этом случае возвращать статус "ошибка").

Цитата:
К сожалению не ловит.
а какие-то другие стандартные .NET эксепшены ловятся вообще? а то это уже странно
Старый 13.12.2021, 08:31   #7  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
На всякий случай спрошу.
Не выполняется ли ваш метод внутри транзакции? Если внутри блока try catch явно написать
X++:
throw exception::Break;
catch сработает?
Старый 13.12.2021, 09:02   #8  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Похоже вы правы. Не перехватывает Exception::Break.

Посмотрел внимательно на класс.
Нужно переделывать код. Есть единственная глобальная пара ttsbegin / ttscommit, других - нет.
В рамках нее и происходит цикл в котором происходит чтение jpeg файлов.
Глобальных try / catch тоже нет.

Как то можно не удаляя глобальные ttsbegin / ttscommit но все же добиться перехвата исключения?

Последний раз редактировалось oleggy; 13.12.2021 в 09:23.
Старый 13.12.2021, 10:14   #9  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Как то можно не удаляя глобальные ttsbegin / ttscommit но все же добиться перехвата исключения?
В аксапте - нет.
Делайте проверку валидности файлов где-то перед транзакцией.
За это сообщение автора поблагодарили: dech (2).
Старый 13.12.2021, 10:22   #10  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от oleggy Посмотреть сообщение
Как то можно не удаляя глобальные ttsbegin / ttscommit но все же добиться перехвата исключения?
Вынести весь код в c# длл и там обрабатывать все исключения.
За это сообщение автора поблагодарили: Pandasama (2).
Старый 13.12.2021, 23:05   #11  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от skuull Посмотреть сообщение
Вынести весь код в c# длл и там обрабатывать все исключения.
Я бы это вынес в отдельную подсессию runAss().
Выцепить сообщение об ошибке может и не получится, как в c#, но вернуть результат загрузки, не нарушая общей нити выполнения - вполне себе норм. Ну а в общем и целом - работать с файлами внутри SQL транзакций очень нежелательно.
Старый 14.12.2021, 20:34   #12  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Pandasama Посмотреть сообщение
В аксапте - нет.
Делайте проверку валидности файлов где-то перед транзакцией.
Поддерживаю.
Работать с файлами внутри транзакции вообще не комильфо ни разу.
__________________
// no comments
Старый 16.12.2021, 15:52   #13  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Может вот так попробовать?

X++:
binData = new BinData();

// LoadFile demands read permission on the file
new FileIOPermission(filename, #io_read).assert();
// BP deviation documented
if (binData.loadFile(filename)) //only works if file not locked
{
	docuValue.File = binData.getData();
}
else
{
	throw error(strfmt("@SYS54217",filename));
}
Исходник в DocuValue.writeDocuFile()
Старый 16.12.2021, 17:38   #14  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
ну, это валидность изображения никак не проверяет
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сгруппировать строки в Excel через .NET BSM_ DAX: Программирование 3 25.12.2013 09:40
fed: Net requirements update in MRP Module and Working Set of MRP Blog bot DAX Blogs 14 08.05.2012 13:09
ssmantha: Debugging .NET code called from X++ code in AX 2012 Blog bot DAX Blogs 1 11.11.2011 15:50
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
Вложение файлов через метод .NET Business Connector (DocuRef, DocuValue) kornix DAX: Программирование 6 18.09.2009 10:36

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:29.