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

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

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

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

Проблема Замена вложения в RichText поле

seoman2

Green Team
17.02.2010
504
1
BIT
45
Есть такая проблемка.
Хочу в текущем доке в RichText поле заменить вложение Файл1.docx на Файл2.docx с винта.

1. Как правильно в UI удалить с рич поля вложение?
Set rtitem = doc.GetFirstItem("text" )
Forall obj In rtitemA.EmbeddedObjects
....
Call obj.remove()
или в бэкэнде:
Call Doc.ReplaceItemValue("text","") ?
или фронт:
Call UIDoc.GotoField("text")
Call uidoc.SelectAll
Call UIDoc.Clear

2. Делаю как тут советуют, создаю временный документ, в него аттачу с винта Файл2.docx, копирую с временного дока с рич поля вложение, вставляю в текущий...

но при этом исчезает иконка вложения.
[doublepost=1512722067,1512658019][/doublepost]Вот код с примера:
Код:
Set DummyDoc = db.CreateDocument
    DummyDoc.Form = "test"
    DummyDoc.SaveOptions = "0"
    Dim DummyRT As NotesRichTextItem
    Set DummyRT = New NotesRichTextItem (DummyDoc,"Body")
    Call DummyRT.EmbedObject(1454,"",docpatch$ + oname$)
    Call DummyRT.Update
        Set DummyUIDoc =  workspace.EditDocument(True,DummyDoc)

В новом доке слетает иконочка файла вложения (((((
 
Последнее редактирование:

seoman2

Green Team
17.02.2010
504
1
BIT
45
В рабочем документе есть в ричтекст поле Файл1.docx, я его сохраняю на винт как Файл2.docx, делаю в нем правки программно и хочу заменить в доке старый Файл1.docx на новый Файл2.docx.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
В рабочем документе есть в ричтекст поле Файл1.docx, я его сохраняю на винт как Файл2.docx, делаю в нем правки программно и хочу заменить в доке старый Файл1.docx на новый Файл2.docx.
спрошу еще раз, по другому...
что мешает сделать в бэкэнде?
т.е.:
-отцепляем ворду из дока
-закрываем док (если открыт в UI), сохраняем изменения, если были
-вносим правки в вордятину
-удаляем аттач в бэкэнде
-загружаем измененный ворд
-открываем док в UI, если надо
да.. ворд прибивать обязательно! виндятский код здесь выкладывал
 

seoman2

Green Team
17.02.2010
504
1
BIT
45
Set rtitemA = doc.GetFirstItem("text" ) - в нем Файл1.docx
rtitemA.EmbeddedObjects ....
после выхода с ворда и изменения аттача в Файл2.docx на винте:
Call doc.Save(True,False)
Call uidoc.Close

Call obj.remove
rtitemA.Update

Call rtitemA.EmbedObject ( EMBED_ATTACHMENT, "", docpatch$ + oname$)
rtitemA.Update

Call uiworkspace.EditDocument(True, doc)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
Код:
Set rtitemA = doc.GetFirstItem("text" )'  -  в нем Файл1.docx
rtitemA.EmbeddedObjects ....
'после выхода с ворда и изменения аттача в Файл2.docx на винте:
Call doc.Save(True,False)
'*****************
Dim db As NotesDatabase, unid As String
Set db=session.CurrentDataBase 'т.к. удалим объект БД надо получить извне
unid=doc.UniversalID
*****************
Call uidoc.Close

'Call obj.remove не понял - кого удаляем, аттачи надо удалять в новом инстансе, полученным перед вставкой
'rtitemA.Update это не нужно, особливо после закрытия UI
'******************
'закрываем фронт!         
 Delete uidoc ' здесь прибъется и объект doc
'теперь убиваем инстанс ворда! иначе залочит файл и в памяти повиснет (и такое бывает)
'код для этого был
.....
'все по-новой получаем
Set doc=db.GetDocumentByUNID(UNID)
'далее хачим аттачи, функцию здесь выложил
Set rtitemA = RemoveAttachments(doc,{text})
 Call rtitemA.EmbedObject ( EMBED_ATTACHMENT, "", docpatch$ + oname$)
 'rtitemA.Update напуркуа это в бэкэнде
                     
Set uidoc=uiworkspace.EditDocument(True, doc) ' если фронт нужно передать куда-то
End Sub
'фильтр по имени аттача приделать на свой вкус, ф-ция хачит все аттачи
Function RemoveAttachments(objdoc As NotesDocument, fld As String) As NotesRichTextItem
    Dim rtItem As NotesRichTextItem
    Dim docItem As NotesItem
   
    On Error GoTo errorhandler
    Set docItem=objdoc.GetFirstItem(fld)
    If Not docItem Is Nothing Then
        DbgMsg("RichText:" & CStr(docItem.Type = RICHTEXT))
        If docItem.Type=RICHTEXT Then
            Set rtItem=docItem
        End If
    End If
    If objdoc.Hasembedded Then  
        If ( Not rtItem Is Nothing ) Then
            If (Not IsEmpty(rtitem.EmbeddedObjects))Then
                ForAll o In rtitem.EmbeddedObjects
                    Call o.Remove
                    DbgMsg("RT field: remove attachments")
                End ForAll
            End If
            'rtItem.Issigned=False
            'rtItem.Issummary=False
            'rtItem.Isencrypted=False
        Else
            If ( Not IsEmpty(objdoc.EmbeddedObjects)) Then
                ForAll o In objdoc.EmbeddedObjects
                    Call o.Remove
                    DbgMsg("remove attachments")
                End ForAll
            End If
        End If
    End If
   
    Do While Not objdoc.GetFirstItem("$FILE") Is Nothing
        objdoc.RemoveItem("$FILE")
        DbgMsg("remove fields: $FILE")
    Loop
'test remove rtItem
'Delete rtItem
'Print {rtItem Is Nothing:} rtItem Is Nothing
    If (rtItem Is Nothing) Then
        Do While Not objdoc.GetFirstItem(fld) Is Nothing
            objdoc.RemoveItem(fld)
            DbgMsg("Remove non RT fields:" & fld)
        Loop
        Set rtItem=objdoc.CreateRichTextItem(fld)
        Call objdoc.Save(True,False)
    End If
    Set RemoveAttachments=rtItem
ExitFunction:
    Exit Function
errorhandler:
    Call RaiseError()
    Resume ExitFunction
End Function
код обертывайте в теги..
каменты оставил в коде
[doublepost=1512746272,1512746025][/doublepost]@WebWare Team куда-то пропала подсветка кода (различных языков) и я не могу править чужие сообщения (опять)
 
Мы в соцсетях:

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