• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Как узнать размер Richtext

  • Автор темы KLif
  • Дата начала
K

KLif

Всем привет. Вообщем такая проблема ... на форме есть richtext, в нём находится всякая ерунда: картинки, доки и т.д.

Нужно узнать размер этого richtext ...

Forall item In uidoc.Document.Items
If item.Name = "Attach_Body" Then
l = item.ValueLength
End If
End Forall

В итоге l = 0, но если я таким же способом переберу все поля, то получу опр значение, после чего добавлю в свой RichText какой-нибудь док, то значение увеличится ...

Ещё один способ:
Set rt = New NotesRichTextItem(uidoc.Document, "Attach_Body")
Msgbox(rt.ValueLength)
при этом, чтобы не лежало на richtext сообщение всегда - "2"
 
M

morpheus

1 Документ ужо сохранён?
2 Надо узнать размер вложений?
 
S

Sandr

RTItem.ValueLength
102-пустое рт поле
Если больше 102, значит там уже что-то есть...
 
K

KLif

1. RT не сохранён ... да, нужно узнать размер вложений, чтобы в дальнейшем его ограничить ...
2. RTItem.ValueLength - выдаёт 2 и причём всегда ...
 
S

Sandr

@AttachmentLengths возвращает размеры аттачей без сохранения дока... Работает и в Evaluate...если надо скриптом...
 
M

morpheus

после сохранения - GetEmbeddedObject method - получаете все вложеия в РТ поле, а патом проверяете их размер

Прастой пример , а одно вложение

Код:
Dim doc As NotesDocument
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
Dim sizeInBytes As Long
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
Set object = rtitem.GetEmbeddedObject( "City picture" )
sizeInBytes = object.FileSize
End If

А можно и собаками -
@AttachmentLengths
 
K

KLif

Так делал, постоянно говорит на строчке sizeInBytes = object.FileSize - что объект не выбран ... но такого не может быть ... док сохранял ...
 
M

morpheus

Для: KLif
Проверять надо
Код:
If not object is Nothing Then sizeInBytes = object.FileSize
 
K

KLif

Для: KLif
Проверять надо
Код:
If not object is Nothing Then sizeInBytes = object.FileSize

Ога, и в результате sizeInBytes = 0, не может он найти объекты в ричтексте ... но они там есть, т.к. сумарный размер документа увеличивается с каждым вложением ...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Можно на скриптах и без сохранения.

Код:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim rtitem As NotesRichTextItem

Set uidoc = ws.CurrentDocument
Call uidoc.Refresh(True)

Set rtitem = uidoc.Document.GetFirstItem("Поле")
If Not Isempty(rtitem.EmbeddedObjects) Then
Forall x In rtitem.EmbeddedObjects
Msgbox Cstr(x.FileSize)
End Forall
End If
 
K

KLif

Можно на скриптах и без сохранения.

Код:
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim rtitem As NotesRichTextItem

Set uidoc = ws.CurrentDocument
Call uidoc.Refresh(True)

Set rtitem = uidoc.Document.GetFirstItem("Поле")
If Not Isempty(rtitem.EmbeddedObjects) Then
Forall x In rtitem.EmbeddedObjects
Msgbox Cstr(x.FileSize)
End Forall
End If

1. rtitem.EmbeddedObjects - пустое
2. Set uidoc = ws.CurrentDocument
Set rt = New NotesRichTextItem(uidoc.Document, "Attach_Body")
Call uidoc.Save - вот так работает, НО размер rt какой то не понятный, почему он не соответствует реальному размеру файла?
 
S

Sandr

1. Если файл аттачится на бекэнде, то аттачи нужно получать потом не из РТитема, а из нотесдокумента.
2. Аттачи пакуются внутренними архиваторами... Птотму и размер не совпадает...
 
K

KLif

1. Если файл аттачится на бекэнде, то аттачи нужно получать потом не из РТитема, а из нотесдокумента.
2. Аттачи пакуются внутренними архиваторами... Птотму и размер не совпадает...

1) пробовал получить из NotesDocument, размер найденого = 0
2) решил остановится на способе:

Set uidoc = ws.CurrentDocument
Set rt = New NotesRichTextItem(uidoc.Document, "Attach_Body")
Call uidoc.Refresh(True)
sizeInBytes = rt.ValueLength

Всем огромное спасибо!
 
S

Sandr

А Вам вообще что, нужно сделать ограничение на размер вклабываемых файлов? Тогда проверяйте размер файла до аттача... Так разумней будет...
 
K

KLif

А Вам вообще что, нужно сделать ограничение на размер вклабываемых файлов? Тогда проверяйте размер файла до аттача... Так разумней будет...

Да, есть richtext, вкладываем файлы и в опр. момент он должен запретить вложение ... я делаю так

1) создал доп. richtext
2) вкладываю в него новые файлы
3) смотрю сумму обоих ричтекстов и сравниваю с границей вложения

Если узнавать размер файла аттача, то:

- Isempty(rtitem.EmbeddedObjects) - в таком случае их нет
- Isempty(doc.EmbeddedObjects) - в таком случае размер равен 0, но если вывести на печать Msgbox (obj.Name) - то он выдаст имя объекта, почему тогда размер 0?
 
S

Sandr

Это не совсем правильно.. Вы сначала выполнили операцию, а птомо узнали размер... Обычно делается наоборот.. Сначала узнаем рамер файла. а потом уже вкладываем файл, если размер подходит... Нужно стараться избегать лишних действий... оптимизиция - это важно даже для лотуса...
 
K

KLif

Это не совсем правильно.. Вы сначала выполнили операцию, а птомо узнали размер... Обычно делается наоборот.. Сначала узнаем рамер файла. а потом уже вкладываем файл, если размер подходит... Нужно стараться избегать лишних действий... оптимизиция - это важно даже для лотуса...

А как узнать размер файла, если мы его вот так получаем:

@Command([EditGotoField];"Attach_Body");
@Command([EditInsertFileAttachment])
 
M

morpheus

Код:
@Command([EditGotoField];"Attach_Body");
@Command([EditInsertFileAttachment]);
@PROMPT( [OK], "", @AttachmentLengths );

Разве что рефреш делать
 
K

KLif

Сделал так, где Temp - доп ричтекст

@Command([EditGotoField];"Temp");
@Command([EditInsertFileAttachment]);
@Command([ToolsRunMacro] ; "(Insert Template2)") - агент, смотрит размер основного ричтекст + темт, если не заходит за границу, то копирует всё из темпа в наш ричтекст ... после чего чистит темп ...

Осталась одна проблем, Temp надо скрыть, но когда он скрыт - с ним нельзя работать ...
 
S

Sandr

А как узнать размер файла, если мы его вот так получаем:

@Command([EditGotoField];"Attach_Body");
@Command([EditInsertFileAttachment])

А что Вам стоит получить его скриптом? Вот Вам готовый пример аттача с проверкаой размера...

Код:
				On Error Goto errhand

Dim file As Variant
Dim rtItem As NotesRichTextItem
Dim obj As Variant
Dim o As notesEmbeddedObject 
Dim verLen As Long

Set doc = uidoc.Document
Set rtItem = doc.GetFirstItem("Body")

Let file = ws.OpenFileDialog(False,"Выберите файл для вложения!")
If Isempty(file) Then Exit Sub

verLen = FileLen(Cstr(File(0)))

If verLen > 1048576 then
Msgbox "Размер файла не должен превышать 1-го Мб"
End If

If rtItem Is Nothing Then
Set rtItem = doc.CreateRichTextItem("Body")
End If

Call rtItem.EmbedObject(1454, "", Cstr(File(0)))
uidoc.Reload
exiting:
Exit Sub
errhand:
Msgbox "Ошибка " & Error & ", в строке " & Cstr(Erl) & ". Выбор вложения."
Resume exiting
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!