我已经使用以下代码将文件复制到Livelink:
Public Function saveFileLL(target As Long, pathSource As String, fileName As String) As Boolean
Dim dav As New ADODB.Record
Dim files As New ADODB.Recordset
Dim objStream As New ADODB.Stream
Dim url As String
If Not Val(Nz(target, 0)) > 0 Or Not pathSource Like "*.*" Or Not fileName Like "*.*" Then
saveFileLL = False
Exit Function
End If
url = URL_LIVELINK_DAV & target
dav.Open url, , adModeReadWrite
Set files = dav.GetChildren
If Not (files.BOF And files.EOF) Then files.MoveFirst
Do Until files.EOF
If fileName Like Replace(files("RESOURCE_DISPLAYNAME"), "_", "?") Then Exit Do
files.MoveNext
Loop
If files.EOF Then
files.addnew "RESOURCE_PARSENAME", fileName
files.Update
End If
files.Close
dav.Close
objStream.Open "URL=" & url & "/" & fileName, adModeWrite
objStream.Type = adTypeBinary
objStream.LoadFromFile pathSource
objStream.Flush
objStream.Close
Set dav = Nothing
Set files = Nothing
Set objStream = Nothing
saveFileLL = True
End Function
现在,正如标题所说,我想做同样的事情但是有一个文件夹。我想我的问题与Livelink无关,但更多的是处理文件夹的方式。是否可以移动包含所有子节点的文件夹而无需遍历所有子文件夹/文件?我怎样才能调整我的saveFileLL()
函数呢?
修改
以下是另一部分代码,允许我直接在objId设计的Livelink文件夹中创建一个文件夹。
Public Function CreateFolderToLLFolder(ObjId As String, folderName As String, Optional getId As Boolean = False) As String
Dim davfile As New ADODB.Record
Dim davFiles As New ADODB.Recordset
Dim davDir As New ADODB.Record
Dim newDirFields(1) As Variant
Dim newDirValues(1) As Variant
newDirFields(0) = "RESOURCE_PARSENAME"
newDirValues(0) = folderName
newDirFields(1) = "RESOURCE_ISCOLLECTION"
newDirValues(1) = True
Set davDir = connection(ObjId, "")
Set davFiles = davDir.GetChildren()
If (davFiles.Supports(adAddNew)) Then
davFiles.addnew newDirFields, newDirValues
End If
davfile.Open davFiles, , adModeReadWrite
CreateFolderToLLFolder = davfile.fields("urn:x-opentext-com:ll:properties:nodeid").value
End Function
Public Function connection(ObjId As String, Optional filename As String = "") As ADODB.Record
Dim davDir As New ADODB.Record
davDir.Open filename, "URL=http://livelink-server/livelinkdav/nodes/" & ObjId & "/", adModeReadWrite, adFailIfNotExists, DelayFetchStream, "", ""
Set connection = davDir
End Function
不要问我为什么会这样,我找到了它并且确实有效。 objId对于那些想知道的是Livelink给他所有文件/文件夹的唯一ID。
谢谢。
答案 0 :(得分:0)
您可以将一整套文件夹及其组成文件/子文件夹保存为一个块,然后压缩它们,然后上传zip文件。像这样http://www.rondebruin.nl/windowsxpzip.htm
如果您想在LiveLink中反映结构,那么您必须浏览文件夹树来复制内容 - 但是还有大量的vba代码可以循环访问文件&文件夹树,如果你必须走这条路,它都可以调用你的saveFileLL函数。
答案 1 :(得分:0)
执行我想要的最简单方法是最终使用集成到Livelink中的Web服务。因为网络上关于整个Livelink API的信息确实不多(考虑到我们现在可以在Google上找到的所有信息,这是令人惊讶的),我愿意在这里发布我的解决方案。事实上这很容易。
我所要做的就是在Firefox中安装一些附加组件(我使用Fox但其他人也会这样做),以便在Livelink中进行一些工作时查看HTTP标头/数据包。大多数情况下,操作都是使用POST方法完成的。我意识到Fox插件发送了3个POST,第一个返回401错误,而第三个返回正确的200响应并完成了操作。
然后,我可以推断出Livelink是基于NTLM身份验证的SOAP服务。它看起来像是在ASP.net中开发的。
要在VBA中使用Web服务,没有比这更容易了。您将需要MSXML2对象的Microsoft XML v6.0 livrary,然后你去:
Dim sMsg As String
Dim sURL As String, postData As String
Dim ObjHTTP As Object
Set ObjHTTP = New MSXML2.XMLHTTP
sURL = "http://server.com/livelink/livelink.exe"
postData = "your-post-data"
ObjHTTP.Open "Post", sURL, False
ObjHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
ObjHTTP.send (postData)
Set ObjHTTP = Nothing
就这么简单,只需使用某种浏览器的插件找到合适的POST数据就可以了。大多数后期数据都没有编码,也很容易处理。