Domanda

Qual è il modo migliore per caricare un file in una raccolta documenti su un server SharePoint tramite i servizi Web integrati esposti dalla versione WSS 3.0?

Dopo le due risposte iniziali...

  • Dobbiamo assolutamente utilizzare il livello del servizio Web poiché effettueremo queste chiamate da applicazioni client remote.

  • Per noi il metodo WebDAV funzionerebbe, ma preferiremmo essere coerenti con il metodo di integrazione dei servizi web.

C'è anche un servizio web per caricare file, doloroso ma funziona sempre.

Ti riferisci al servizio “Copia”?Abbiamo avuto successo con questo servizio CopyIntoItems metodo.Sarebbe questo il modo consigliato per caricare un file nelle raccolte documenti utilizzando solo l'API del servizio Web WSS?

Ho pubblicato il nostro codice come risposta suggerita.

È stato utile?

Soluzione

Esempio di utilizzo del servizio Web WSS "Copia" 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)
    {
        // ...
    }
}

Altri suggerimenti

Un'altra opzione è utilizzare il semplice vecchio HTTP PUT:

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 necessita che il documento sia già presente su qualche server.Il documento viene passato come parametro della chiamata al servizio web, che limiterà la dimensione del documento.(Vedere http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c)
  • il metodo 'http put' (ad esempio webdav...) inserirà solo il documento nella libreria, ma non imposterà i valori dei campi
  • per aggiornare i valori dei campi puoi chiamare Lists.UpdateListItem dopo "http put"
  • le raccolte documenti possono avere directory, puoi crearle con "http mkcol"
  • potresti voler archiviare i file con Lists.CheckInFile
  • è inoltre possibile creare un servizio Web personalizzato che utilizzi l'API SPxxx .Net, ma il nuovo servizio Web dovrà essere installato sul server.Potrebbe risparmiare viaggi al 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: Modificando il primo parametro di CopyIntoItems al nome del file, Path.GetFileName(destinationUrl), fa scomparire il messaggio di scollegamento.

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

Da un collega al lavoro:

Modo pigro:l'interfaccia del file system Windows WebDAV.Non è una soluzione programmatica perché si basa sul servizio WindowsClient in esecuzione sul sistema operativo e funziona solo su siti Web in esecuzione sulla porta 80.Mappare un'unità nella raccolta documenti e iniziare la copia dei file.

C'è anche un servizio web per caricare file, doloroso ma funziona sempre.

Credo che tu possa caricare file tramite l'API di FrontPage ma non conosco nessuno che lo utilizzi effettivamente.

Non sei sicuro di quale servizio Web utilizzare, ma se ti trovi nella posizione di poter utilizzare le DLL API di SharePoint .NET, utilizzare SPList e SPLibrary.Items.Add è davvero semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top