Не получается переименовывать вложения на русском языке ((
Основная кнопка переименовать.
Sub Click(Source As Button) ' Через МИМЕ - не пашет
On Error Goto ErrH
Dim session As New NotesSession, ws As New NotesUIWorkspace, db As NotesDatabase, sview As NotesView, dc As NotesDocumentCollection
Dim uidoc As NotesUIDocument, doc As NotesDocument, templdoc As NotesDocument, DocTemp As NotesDocument
Dim picklist As Variant, mes As String
Dim rtitem As NotesRichTextItem
Dim Name_Stncl_List() ' все имена вложений
Set doc = ws.CurrentDocument.Document
Set uidoc=ws.CurrentDocument
Call uidoc.save
Set rtitem = doc.GetFirstItem("attach")
Dim xxxx As Integer
i=0
If ( rtitem.Type = RICHTEXT ) Then
If Not Isempty(rtitem.EmbeddedObjects) Then
Forall obj In rtitem.EmbeddedObjects
If obj.Type = EMBED_ATTACHMENT Then ' шаг 1 имена вложений в массив
If obj.FileSize=0 Then
xxxx = Messagebox ({"Приложение: } & obj.Source & { имеет размер 0 байт.} & Chr(13) & Chr(13) & {Удалить?"}, 1 , "Удаление нулевого вложения." )
If xxxx = 1 Then
doc.history= Cstr(Now) + " "+ session.CommonUserName + " удалено приложение размером 0 байт (" + obj.Source + ") " &Chr(13) & " "&Chr(13) & doc.history(0)
Call obj.Remove
doc.ReplaceItemValue({SaveOptions},{0}).SaveToDisk=False
Call doc.save (True,False)
Call uidoc.Close
Call ws.EditDocument(True, doc) ' False - чтение
Exit Sub
End If
Else
Redim Preserve Name_Stncl_List(i)
Name_Stncl_List(i)= obj.Source & {|}& obj.Name ' в Name_Stncl_List вносим имена вложений (Source) и альясы (Name)
i=i+1
End If
End If
End Forall
End If
End If
If i>0 Then 'есть хоть одно вложение в поле атач
Set DocTemp = doc.ParentDatabase.CreateDocument
DocTemp.ReplaceItemValue "Name_ListAttach", Name_Stncl_List ' скрытое поле Name_ListAttach на диалог формне с Source | Name
If Not ws.DialogBox("ChooseDlg",True,True,False,False,False,False,"Переименовать ",doctemp, True) Then Exit Sub
nameobj2 = doctemp.ListAttach(0)
Print "---"
Print nameobj2 ' псевдоним Name
End If
datapatch$ = "C:\XML\"
If Dir$ (datapatch$ ,16 )="" Then
Mkdir datapatch$
End If
i=1
Forall obj In rtitem.EmbeddedObjects
If obj.Name = nameobj2 Then ' nameobj2 - ямя выбранного вложения (псевдоним)
Dim object3 As NotesEmbeddedObject
Set object3 = rtitem.GetEmbeddedObject(nameobj2)
Print "object3.Source " object3.Source
new_nameobj=Trim(Inputbox$("Введите новое имя приложения " & i ,"Ввод названия приложения",Strleftback(object3.Source,".") )) ' строка слева от первой точки ( без расширения)
If new_nameobj="" Then Exit Sub
new_nameobj = new_nameobj & "." & Strrightback (object3.Source,".") ' имя + расширение файла
If new_nameobj<>nameobj2 Then ' надо переименовать
Call obj.ExtractFile( datapatch$ & nameobj2)
Name datapatch$ & nameobj2 As datapatch$ & new_nameobj ' переименовать файл nameobj на диске в new_nameobj
'Call rtitem.EmbedObject ( EMBED_ATTACHMENT, "", datapatch$ & new_nameobj) СЛЕТАЕТ ИКОНКА
Call GetEmbedObject ("attach", datapatch$ & new_nameobj, doc )
' Msgbox object.Name
' Call object.Remove
Kill datapatch$ & new_nameobj
End If
End If
i=i+1
End Forall
Call doc.ComputeWithForm(False, False)
Call doc.Save(1,0)
Call uidoc.save
Print "11."
' Set rtitem = doc.GetFirstItem("attach")
' Forall obj In rtitem.EmbeddedObjects
' Print object.Source
' For i = 1 To Len(object.Source)
' ch = Mid$(object3.Source, i, 1)
' Print "Символ=" & ch & ", Код(Asc)=" & Asc(ch)
' Next
' End Forall
Print "Сохранили."
' doc.history= Cstr(Now) + " "+ session.CommonUserName + " переименовано приложение (" + nameobj + ") " &Chr(13) & " "&Chr(13) & doc.history(0)
' doc.ReplaceItemValue({SaveOptions},{0}).SaveToDisk=False
' Call doc.save (True,False)
' Call uidoc.Close
' Call ws.EditDocument(True, doc) ' False - чтение
Exit Sub
ErrH:
Print "Ошибка " & Error(Err) & " в строке " & Erl
Exit Sub
End Sub
Функция GetEmbedObject - получает имя лотусового поля, имя файла и его расширение и документ.
Так как лотус не может корректно кодировать русские имена файлов, то кодируем имя файла и расширение в Base64.
Оборачиваем в =?UTF-8?B?...?= полученные данные.
Попытка указывать KOI8-R кодировку, как это делает лотус. Но не пашет.
Function GetEmbedObject(FieldName As String, fName As String, doc As NotesDocument)
' получаем FieldName - поле на лотус-форме , fName - путь к файлу+ имя файла с расширением
On Error Goto ErrH
Print "Start GetEmbedObject " + FieldName +" " + fName
Dim session As New NotesSession, ws As New NotesUIWorkspace, CurDataBase As NotesDataBase
Dim body As NotesMIMEEntity, header As NotesMIMEHeader , child As NotesMIMEEntity
Dim fName2 As String
Dim uidoc As NotesUIDocument
Set CurDataBase=session.CurrentDataBase
Dim docR As NotesDocument'документ TMP'
Set uidoc =ws.CurrentDocument
Set docR = New NotesDocument( CurDataBase ) ' создали новый док в базе роутер
docR.Form="work form" ' временная форма
docR.header ="TEST TMP"
docR.adresed = "1"
docR.isp = "1"
fName2 = Strrightback (fName,"\")
fName2 = Replace(fName2, Chr(5), "") ' попытка убадить спецсимвол  с русских имен файла после прикрепления.
Print "fName2:" fName2 ' имя файла без пути к файлу
file_ext$ = Strrightback (fName2,".") ' расширение файла
file_name$ = Strleftback (fName2,".") 'имя файла
session.ConvertMIME = False
Dim streamIn As NotesStream
Set streamIn = session.CreateStream
Call streamIn.Open(fName, "UTF-8") ' KOI8-R
Set body = docR.CreateMIMEEntity("Body")
' Notes некорректно кодирует русские имена файлов в MIME-заголовке - в имени файла появляется «квадратик» после каждого рус. символа.
' НАДО закодировать имя в MIME, используя стандарт RFC 2231 или Base64.
' Примеры ниже взяты с лотус дока с миме аттачем.
' ВАРИАНТ 1. - АНГЛ символы или ЦИФРЫ "112233.doc" - работает корректно данная функция.
' Content-Type: application/octet-stream; name="112233.doc"
' Content-Disposition: attachment; filename="112233.doc"
' Content-Transfer-Encoding: binary
' ВАРИАНТ2 - рус. символы. "ааббвв.doc"
'Content-Type: application/octet-stream; name="=?KOI8-R?B?wcHCwtfXLmRvYw==?="
'Content-Disposition: attachment; filename="=?KOI8-R?B?wcHCwtfXLmRvYw==?="
'Content-Transfer-Encoding: binary
Dim b64 As New CBase64()
b64Text$ = b64.encodeString (fName2 ) ' КОДИРУЕМ В64 имя файла
Print "//" + b64Text$ + "//"
b64Text$ = "=?UTF-8?B?" + b64Text$ + "?=" ' обернуть имя файла с расширением в =?UTF-8?B?...?=
'b64Text$ = "=?KOI8-R?B?" + b64Text$ + "?="
Print b64Text$
Set header = body.CreateHeader("Content-Type")
' Call header.SetHeaderVal("multipart/mixed")
Call header.SetHeaderValAndParams({application/octet-stream; name="} + b64Text$ + {"} ) ' attachment "multipart/alternative" application/octet-stream. - неизвестный тип данных. application/msword
' Content-Disposition ghj,e. с ДВУМЯ вариантами имени:
' - RFC 2231: filename*="UTF-8''%..%.." (percent-encoding) и имя файла percent-encoding в формате (UTF-8''%D0%9E%D1%82%D1%87%D1%91%D1%82.docx).
' - RFC 2047: filename="=?UTF-8?B?...?="
' dispVa$ = |attachment; filename*="UTF-8''| & UrlEncodeUTF8(fName2) & |"; filename="| & b64Text$ & |"| ' Сразу 2 варианта
' dispVa$ = |attachment; filename*="UTF-8' '| & UrlEncodeUTF8(fName2) & "." & file_ext$ & |";| ' вариант с урл-процентами
dispVa$ = |attachment; filename="| & b64Text$ & |"|
Print "dispVa$ =" dispVa$
Set header = body.CreateHeader("Content-Disposition")
Call header.setHeaderVal( dispVa$ )
Set header = body.CreateHeader("Content-Transfer-Encoding")
Call header.setHeaderVal( "base64")
Call body.SetContentFromBytes(streamIn, "application/vnd.openxmlformats-officedocument.wordprocessingml.document" , ENC_BASE64)
Call body.EncodeContent (ENC_BASE64)
Call docR.Save(True, True )
Call streamIn.Close()
flag = docR.Closemimeentities(True)
Print "flag " flag
session.ConvertMIME = True
' Call ws.EditDocument(True, docR) ' False - чтение
Print "OK"
Dim ftuidoc As NotesUIDocument
Set ftuidoc = ws.EditDocument( True, docR , True , , True, False )' временный док
Call ftuidoc.GoToField( "Body" )
Call ftuidoc.SelectAll
Call ftuidoc.Copy
Call ftuidoc.Close(True)' временный док
Call uidoc.GoToField(FieldName )
Call uidoc.Paste
Call uidoc.Refresh
Call uidoc.Save
Print "GetEmbedObject Конец"
Exit Function
ErrH:
Print "Ошибка GetEmbedObject" & Error(Err) & " в строке " & Erl
Exit Function
End Function
Попытка кодировать имя файла в формат урл-процентов, тоже не дал результата.
Function UrlEncodeUTF8(txt As String) As String
Dim i As Integer, c As Integer
Dim out As String
Dim session As New NotesSession
Dim st As NotesStream
Dim bytes As Variant
Print "Start UrlEncodeUTF8 "
On Error Goto ErrH
' Преобразуем Unicode-строку в UTF-8 байты
Set st = session.CreateStream()
' Записываем строку в поток как UTF-8
Call st.WriteText(txt, ENC_UTF8)
st.Position = 0
' Читаем все байты в variant-массив
bytes = st.Read() ' возвращает массив байтов (Variant)
For i = Lbound(bytes) To Ubound(bytes)
c = bytes(i)
' Разрешённые символы RFC 3986: буквы, цифры и - . _ ~
If (c >= 48 And c <= 57) Or _ ' 0-9
(c >= 65 And c <= 90) Or _ ' A-Z
(c >= 97 And c <= 122) Or _ ' a-z
c = 45 Or c = 46 Or c = 95 Or c = 126 Then
out = out & Chr$(c)
Else
out = out & "%" & Right$("0" & Hex$(c), 2)
End If
Next
' out="%D0%B0%D0%B1+%D0%B2" ' тест на имени файла "аб в"
Print "UrlEncodeUTF8"
Print out
UrlEncodeUTF8 = out
Exit Function
ErrH:
Print "Ошибка UrlEncodeUTF8" & Error(Err) & " в строке " & Erl
Exit Function
End Function