Carica un file in SharePoint tramite i servizi web integrati

Qual è il modo migliore per caricare un file in una Document Library su un server SharePoint tramite i servizi Web incorporati che la versione WSS 3.0 espone?

Seguendo le due risposte iniziali …

  • Abbiamo sicuramente bisogno di utilizzare il livello del servizio Web poiché effettueremo queste chiamate da applicazioni client remote.

  • Il metodo WebDAV funzionerebbe per noi, ma preferiremmo essere coerenti con il metodo di integrazione del servizio web.

C’è anche un servizio web per caricare file, doloroso ma funziona tutto il tempo.

Ti riferisci al servizio “Copia”? Abbiamo avuto successo con il metodo CopyIntoItems questo servizio. Questo sarebbe il modo consigliato di caricare un file in Librerie documenti utilizzando solo l’API del servizio Web WSS?

Ho pubblicato il nostro codice come risposta suggerita.

Esempio di utilizzo del servizio Web “Copia” WSS per caricare un documento in una libreria …

 public static void UploadFile2007(string destinationUrl, byte[] fileData) { // List of desination Urls, Just one in this example. string[] destinationUrls = { Uri.EscapeUriString(destinationUrl) }; // Empty Field Information. This can be populated but not for this example. SharePoint2007CopyService.FieldInformation information = new SharePoint2007CopyService.FieldInformation(); SharePoint2007CopyService.FieldInformation[] info = { information }; // To receive the result Xml. SharePoint2007CopyService.CopyResult[] result; // Create the Copy web service instance configured from the web.config file. SharePoint2007CopyService.CopySoapClient CopyService2007 = new CopySoapClient("CopySoap"); CopyService2007.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; CopyService2007.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation; CopyService2007.CopyIntoItems(destinationUrl, destinationUrls, info, fileData, out result); if (result[0].ErrorCode != SharePoint2007CopyService.CopyErrorCode.Success) { // ... } } 

Un’altra opzione è quella di usare plain PUT HTTP:

 WebClient webclient = new WebClient(); webclient.Credentials = new NetworkCredential(_userName, _password, _domain); webclient.UploadFile(remoteFileURL, "PUT", FilePath); webclient.Dispose(); 

Dove RemoteFileURL punta alla raccolta documenti di SharePoint …

Ci sono un paio di cose da considerare:

  • Copy.CopyIntoItems richiede che il documento sia già presente su alcuni server . Il documento viene passato come parametro della chiamata al servizio web, che limiterà la dimensione del documento. (Vedi http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c )
  • il metodo “http put” (cioè webdav …) inserisce il documento nella libreria, ma non imposta i valori dei campi
  • per aggiornare i valori dei campi, puoi chiamare Lists.UpdateListItem dopo “http put”
  • le librerie di documenti possono avere directory, puoi renderle con ‘http mkcol’
  • potresti voler controllare i file con Lists.CheckInFile
  • è anche ansible creare un servizio Web personalizzato che utilizza l’API .xx di SPxxx, ma tale nuovo servizio Web dovrà essere installato sul server. Potrebbe salvare viaggi sul server.
 public static void UploadFile(byte[] fileData) { var copy = new Copy { Url = "http://servername/sitename/_vti_bin/copy.asmx", UseDefaultCredentials = true }; string destinationUrl = "http://servername/sitename/doclibrary/filename"; string[] destinationUrls = {destinationUrl}; var info1 = new FieldInformation { DisplayName = "Title", InternalName = "Title", Type = FieldType.Text, Value = "New Title" }; FieldInformation[] info = {info1}; var copyResult = new CopyResult(); CopyResult[] copyResults = {copyResult}; copy.CopyIntoItems( destinationUrl, destinationUrls, info, fileData, out copyResults); } 

NOTA: la modifica del 1 ° parametro di CopyIntoItems sul nome file, Path.GetFileName(destinationUrl) , fa scomparire il messaggio di scollegamento.

Ho avuto fortuna usando la class wrapper DocLibHelper qui descritta: http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html

Da un colleage al lavoro:

Lazy way: l’interfaccia del filesystem Windows WebDAV. È una soluzione programmatica ctriggers perché si basa sul servizio Windows Client in esecuzione sul sistema operativo e funziona anche sui siti Web in esecuzione sulla porta 80. Connetti un’unità alla raccolta documenti e ottieni la copia dei file.

C’è anche un servizio web per caricare file, doloroso ma funziona tutto il tempo.

Credo che tu sia in grado di caricare file tramite l’API di FrontPage ma non conosco nessuno che la usi effettivamente.

Non è sicuro su quale sia esattamente il servizio web da utilizzare, ma se si è in una posizione in cui è ansible utilizzare le DLL dell’API di SharePoint .NET, l’utilizzo di SPList e SPLibrary.Items.Add è molto semplice.