当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2008年9月4日木曜日

文書内の添付ファイルを取得する

リッチテキスト内の添付ファイルを取得するのは、割と簡単にできる。
今までにもそのような記事は書いてきた。
今回は、リッチテキストにこだわらずに、文書内にある全部の添付ファイルを取得すると言うことをやってみよう。

サンプルは、自文書内にある全部の添付ファイルを取得して、それらのファイル名を表示するものである。

実は、このサンプルには不具合?がある。
同一文書内に、同じファイル名の添付ファイルがあると、片方は内部ファイル名しか取得できないのだ。
今のところ、これを回避するすべは見つかっていない。
もし、回避策(というか解決策)をご存じの方がいれば、コメントしていただきたい。

Sub Click(Source As Button)
    Dim uiws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim udoc As NotesDocument
    Dim vardt As Variant
    Dim item As Variant
    Dim eobj As NotesEmbeddedObject
    
    Set uidoc = uiws.CurrentDocument
    Set udoc = uidoc.Document
    vardt = udoc.Items
    Forall x In vardt
        Set item = x
        If item.Type = 1084 Then
            Forall z In item.Values
                Set eobj = udoc.GetAttachment( z )
                Msgbox "正式ファイル名:" & eobj.Source & Chr$(10) & "内部ファイル名:" & eobj.Name, 0, item.Name & "のファイル名"
            End Forall
        End If
    End Forall
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

3 件のコメント:

わろ さんのコメント...

はじめまして。

R5と6.5の環境しかないのでそれより後のリリースについてはわかりませんが、NotesEmbeddedObjectクラスのSourceプロパティを参照すれば同名の添付ファイルでもちゃんとファイル名を返してくれます。

ただし、R5の場合は2つ目以降はNameプロパティと同じ内部識別名になります(仕様なのかバグなのかわかりませんが)。

およよ さんのコメント...

わろさん、コメントありがとうございます。

NotesEmbeddedObjectsクラスのSourceプロパティで本物のファイル名を返してくれるのは知っていました。
今回、やられた!のは、同一文書内にある複数のリッチテキスト間で同名の添付ファイルが貼られている場合なんです。
特に、そのうちの1つがWebのファイルアップロードの場合はどうしようもありません。

文書内にリッチテキストが複数存在する場合、どこに添付ファイルがあるか分からないため、全フィールドを検索してるのですが、
その時に、ファイルアップロードだと、$FILEにしか存在しないんですね。
こいつのフィールドタイプが1084(添付ファイル)なんです。

なので、文書内のリッチテキストを探すのではなく、$FILEを探すようにしないといけなかったのです。
このとき、同名のファイルが存在すると、片方は内部ファイル名になってしまうのです。
ここからNotesEmbeddedObjectクラスを生成するには、NotesDcoumentクラスのGetEmbeddedObjectメソッドを利用しているのですが、
このメソッドに内部ファイル名を指定すると、NotesEmbeddedObjectクラスのSourceプロパティも内部ファイル名になってしまうのです。


ということで、$FILEを検索する以外に、Notes文書内に存在する全添付ファイルを取得する方法を模索している最中でした。
言葉足らずでしたね、フォローありがとうございました

わろ さんのコメント...

そういうことでしたか。失礼致しました。

$Fileしかない添付ファイルはどこにも内部ファイル名変換前のファイル名が残っていないのでおっしゃる通り不可能ですね。

それ以外の添付ファイルは、GetAttachmentが使えないとなるとNotesItemのEmbeddedObjectsのアイテムのNameプロパティと総当りで比較して一致したアイテムのSourceプロパティをファイル名とするしかないかも知れませんね。