Загрузка файлов в SharePoint с использованием RPC (Vbscript)

#sharepoint #vbscript #rpc

#sharepoint #vbscript #rpc

Вопрос:

В настоящее время я использую следующие сценарии VB и вызовы RPC frontpage для загрузки документов и их перспективных значений метаданных, которые настроены в сценарии, на сайт Sharepoint 2007 и 2010. Однако файлы с расширением * .xlsx или * .docx не загружают свои метаданные с помощью этого скрипта.

После исследования различных веб-сайтов, похоже, возникла проблема с тем, как _vti_aut / author .библиотека dll обрабатывает новый формат open Office в WSS 3.0. Некоторые предложения заключаются в использовании метода SetDocsMetaInfo после загрузки файла на сайт SharePoint.

Проблема в том, что я не понимаю, как использовать этот метод с этим скриптом. Когда я пытаюсь его использовать, я могу загрузить файл * .xlsx или * .docx с правильными метаданными, но затем файл повреждается.

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

Может ли кто-нибудь привести несколько примеров использования этого метода (SetDocsMetaInfo) с помощью приведенного ниже сценария или предоставить решение этой проблемы с помощью этого сценария?

Этот оригинальный сценарий был получен с этого веб-сайта:

 UploadFile "C:TestWorktempdefertestDoc_083011.xlsx", _     
"http://sharepoint.domainname.com/Sites/SITE1", _     
"TestImport/folder1/testDoc_083011.xlsx_083011.xlsx", _     
"Test", _     
"Test checkin comment", _     
"", "" 

MsgBox "Done" 

Function StringToByteArray(str)    

    Set stream = CreateObject("ADODB.Stream")    
    stream.Open    
    stream.Type = 2 ''adTypeText    
    stream.Charset = "ascii"    
    stream.WriteText str    
    stream.Position = 0    
    stream.Type = 1 ''adTypeBinary    
    StringToByteArray = stream.Read()    
    stream.Close 

End Function  

Sub UploadFile(sourcePath, siteUrl, docName, title, checkincomment, userName, password)  

    strHeader = "method=put document:12.0.4518.1016"   _       
    "amp;service_name=/"   _       
    "amp;document=[document_name="   Escape(docName)   _       
    ";meta_info=[vti_title;SW|"   Escape(title)   ";Business Unit;SW|"   Escape("Business Unit")  "]]"   _       
    "amp;put_option=overwrite,createdir,migrationsemantics"   _       
    "amp;comment="   _       
    "amp;keep_checked_out=false"   vbLf 

    bytearray = StringToByteArray(strHeader)    

    Set stream = CreateObject("ADODB.Stream")    
    stream.Open    
    stream.Type = 1 ''adTypeBinary    
    stream.Write byteArray 

    Set stream2 = CreateObject("ADODB.Stream")    
    stream2.Open    
    stream2.Type = 1 ''adTypeBinary    
    stream2.LoadFromFile sourcePath    
    stream2.CopyTo stream, -1    
    stream.Position = 0     

    Set xmlHttp = CreateObject("MSXML2.XMLHTTP")    
    xmlHttp.open "POST", siteUrl   "/_vti_bin/_vti_aut/author.dll", false, userName, password    
    xmlhttp.setRequestHeader "Content-Type","application/x-vermeer-urlencoded"    
    xmlhttp.setRequestHeader "X-Vermeer-Content-Type","application/x-vermeer-urlencoded"    
    xmlhttp.setRequestHeader "User-Agent", "FrontPage"    
    xmlHttp.send stream     

    If xmlHttp.status = 200 Then         
        If Instr(xmlHttp.responseText, "successfully") = 0 Then            
            MsgBox "ERROR: " amp; vbCrLf amp; xmlHttp.responseText                
        Else            

            ''Checkin            
            strHeader = "method=checkin document:12.0.4518.1016"   _              
            "amp;service_name=/"   _              
            "amp;document_name=" amp; Escape(docName)   _              
            "amp;comment="   Escape(checkincomment)   _              
            "amp;keep_checked_out=false"   vbLf      

            Set xmlHttp = CreateObject("MSXML2.XMLHTTP")           
            xmlHttp.open "POST", siteUrl   "/_vti_bin/_vti_aut/author.dll", false, userName, password           
            xmlhttp.setRequestHeader "Content-Type","application/x-vermeer-urlencoded"           
            xmlhttp.setRequestHeader "X-Vermeer-Content-Type","application/x-vermeer-urlencoded"           
            xmlhttp.setRequestHeader "User-Agent", "FrontPage"           
            xmlHttp.send strHeader           
        End If     
    End If     

      If xmlHttp.status / 100 <> 2 Then       
        MsgBox "ERROR: status = " amp; xmlHttp.status amp; vbCrLf amp; xmlHttp.responseText    
      End If  
End Sub  
  

Ответ №1:

У меня была только эта проблема, и я обнаружил, что использование явно устаревшей версии процедуры работает в соответствии с приведенным ниже кодом Set document meta-info работает нормально:

 Public Sub SetSPMetaData(ByVal sURL As String, ByVal sDocName As String, ByVal sTitle As    String, _
                     Optional ByVal OriginalPath As String, Optional ByVal OriginalName As String, _
                     Optional ByVal ModDate As Date, Optional ByVal FileID As Long)

Dim strHeader As String
Dim byteArray() As Byte
Dim stream As New ADODB.stream
Dim stream2 As New ADODB.stream
Dim xmlHTTP As New MSXML2.xmlHTTP
Dim sTempFile As String
Dim UserName As String
Dim Password As String


On Error GoTo SetSPMetaData_Error

'Method = setDocsMetaInfo: server_extension_version
'amp;service_name=/[amp;listHiddenDocs=(true|false)]
'amp;listLinkInfo=(true|false)amp;url_list=list_of_urls
'amp;metaInfoList=(list_of_meta_info)[amp;errorFlags=(KeepGoing|StopOnFirst)]


'POST /site_url/_vti_bin/_vti_aut/author.dll HTTP/1.0
'.
'.
'.
'method=set docs meta info:6.0.n.nnnn
'amp;service_name=/
'amp;url_list=[List_Name/File_Name]
'amp;metaInfoList=[[vti_title;SR|Web Settin>SW|fp40]]true
'amp;listLinkInfo=true

If OriginalPath = "" And OriginalName = "" Then
    strHeader = "method=set document meta-info:6.0.n.nnnn"   _
                "amp;service_name=/amp;document_name=" amp; sDocName amp; _
                "amp;meta_info=[vti_title;SR|" amp; Replace(Escape(sTitle), "", "\") amp; "]"
Else

    If OriginalName = "" Then
        If CLng(ModDate) = 0 Then

            strHeader = "method=set document meta-info:6.0.n.nnnn"   _
                        "amp;service_name=/amp;document_name=" amp; sDocName amp; _
                        "amp;meta_info=[vti_title;SR|" amp; Replace(Escape(sTitle), "", "\") amp; _
                        ";Original Path;SR|" amp; Replace(Escape(OriginalPath), "", "\") amp; "]"


        Else

            strHeader = "method=set document meta-info:6.0.n.nnnn"   _
                        "amp;service_name=/amp;document_name=" amp; sDocName amp; _
                        "amp;meta_info=[vti_title;SR|" amp; Replace(Escape(sTitle), "", "\") amp; _
                        ";Original Modified|" amp; Format(ModDate, "DD MMM YYYY hh:mm:ss") amp; _
                        ";Original Path;SR|" amp; Replace(Escape(OriginalPath), "", "\") amp; "]"

        End If

    Else

        If CLng(ModDate) = 0 Then
            strHeader = "method=set document meta-info:6.0.n.nnnn"   _
                        "amp;service_name=/amp;document_name=" amp; sDocName amp; _
                        "amp;meta_info=[vti_title;SR|" amp; Replace(Escape(sTitle), "", "\") amp; _
                        ";Original Name;SR|" amp; Replace(Escape(OriginalName), "", "\") amp; _
                        ";Original Path;SR|" amp; Replace(Escape(OriginalPath), "", "\") amp; "]"
        Else

            strHeader = "method=set document meta-info:6.0.n.nnnn"   _
                        "amp;service_name=/amp;document_name=" amp; sDocName amp; _
                        "amp;meta_info=[vti_title;SR|" amp; Replace(Escape(sTitle), "", "\") amp; _
                        ";Original Name;SR|" amp; Replace(Escape(OriginalName), "", "\") amp; _
                        ";Original Modified;TW|" amp; Format(ModDate, "DD MMM YYYY hh:mm:ss") amp; _
                        ";Original Path;SR|" amp; Replace(Escape(OriginalPath), "", "\") amp; "]"

        End If
    End If
End If

byteArray = StringToByteArray(strHeader)

'Set stream = CreateObject("ADODB.Stream")

If gConfig.GetConfig("frmHTTPAuthentication") = 2 Then
    If gConfig.GetConfig("txtUserPassword") <> "" Then Password = gConfig.GetConfigDecrypt("txtUserPassword")
    If gConfig.GetConfig("txtUserName") <> "" Then UserName = gConfig.GetConfigDecrypt("txtUserName")
End If

stream.Open
stream.Type = 1    ''adTypeBinary
stream.Write byteArray


stream.Position = 0
'stream.SaveToFile "C:StreamContent.txt"

xmlHTTP.Open "POST", sURL   "/_vti_bin/_vti_aut/author.dll", False, UserName, Password
xmlHTTP.setRequestHeader "Content-Type", "application/x-vermeer-urlencoded"
xmlHTTP.setRequestHeader "X-Vermeer-Content-Type", "application/x-vermeer-urlencoded"
xmlHTTP.setRequestHeader "User-Agent", "FrontPage"
xmlHTTP.send stream

If xmlHTTP.Status = 200 Then

    If InStr(xmlHTTP.responseText, "osstatus=0") <> 0 Then
        '230               MsgBox "Error - " amp; cleanup_html(xmlHTTP.responseText)
        Call LogErrorFilFol(GetFileFromPath(sURL), GetFolderFromPath(sURL), _
                            "SetSPMetaData - osstatus = 0 - " amp; cleanup_html(xmlHTTP.responseText), FileID)
    End If
    '260           Debug.Print xmlHTTP.responseText

Else

    Call LogErrorFilFol(GetFileFromPath(sURL), GetFolderFromPath(sURL), "SetSPMetaData - Status = " amp; xmlHTTP.Status, FileID)

End If