10.12.2021, 13:04 | #1 |
Участник
|
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 |
Участник
|
А если в .NET такой файл указанным методом открыть - какой эксепшен кидается? OutOfMemoryException?
|
|
10.12.2021, 13:49 | #3 |
Участник
|
Да, срабатывает это исключение
|
|
10.12.2021, 14:21 | #4 |
Роман Долгополов (RDOL)
|
|
|
13.12.2021, 04:59 | #5 |
Участник
|
Это первое что я проверил когда столкнулся с этой проблемой.
К сожалению не ловит. Поэтому и пришел к выводу что может как то можно проверить каким либо отдельным методом Net. на валидность. Но такового я не нашел. Может в новых Net это и есть, но у меня DAX09 там Net 2.0.5... Либо тупо открывать файл в бинарном виде и проверять какие то конкретные байты, в определенных местах (какие должны быть у JPEG файла) хотя мне кажется тут много подводных камней, файл то может быть ломанным по разному.. Последний раз редактировалось oleggy; 13.12.2021 в 05:28. |
|
13.12.2021, 06:08 | #6 |
Участник
|
Судя по обсуждениям вроде https://stackoverflow.com/questions/...file-is-a-jpeg нормально пути проверить нет.
Там есть проверка небольших мета-данных, но если надо убедиться что файл не сломанный, а не просто "не является jpeg", то это скорее всего не поможет. А тогда рекомендуют загрузить файл и обработать эксепшен Думаю, в общем виде эта проблема решается только полным парсингом джпега. Возможно, можно найти какую-то стороннюю библиотеку, которая загружает джпег с другим исключением (или даже с возвратом boolean успеха). Ну или можно написать её самому (сделать в библиотеке нормальный .NETовский перехват эксепшена и в этом случае возвращать статус "ошибка"). Цитата:
К сожалению не ловит.
|
|
13.12.2021, 08:31 | #7 |
Участник
|
На всякий случай спрошу.
Не выполняется ли ваш метод внутри транзакции? Если внутри блока try catch явно написать X++: throw exception::Break; |
|
13.12.2021, 09:02 | #8 |
Участник
|
Похоже вы правы. Не перехватывает Exception::Break.
Посмотрел внимательно на класс. Нужно переделывать код. Есть единственная глобальная пара ttsbegin / ttscommit, других - нет. В рамках нее и происходит цикл в котором происходит чтение jpeg файлов. Глобальных try / catch тоже нет. Как то можно не удаляя глобальные ttsbegin / ttscommit но все же добиться перехвата исключения? Последний раз редактировалось oleggy; 13.12.2021 в 09:23. |
|
13.12.2021, 10:14 | #9 |
Участник
|
Цитата:
Как то можно не удаляя глобальные ttsbegin / ttscommit но все же добиться перехвата исключения?
Делайте проверку валидности файлов где-то перед транзакцией. |
|
|
За это сообщение автора поблагодарили: dech (2). |
13.12.2021, 10:22 | #10 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Pandasama (2). |
13.12.2021, 23:05 | #11 |
Боец
|
Я бы это вынес в отдельную подсессию runAss().
Выцепить сообщение об ошибке может и не получится, как в c#, но вернуть результат загрузки, не нарушая общей нити выполнения - вполне себе норм. Ну а в общем и целом - работать с файлами внутри SQL транзакций очень нежелательно. |
|
14.12.2021, 20:34 | #12 |
Участник
|
Цитата:
Работать с файлами внутри транзакции вообще не комильфо ни разу.
__________________
// no comments |
|
16.12.2021, 15:52 | #13 |
Участник
|
Может вот так попробовать?
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)); } |
|
16.12.2021, 17:38 | #14 |
Участник
|
ну, это валидность изображения никак не проверяет
|
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|