2009-02-27 9 views
9

Ciao Ho il seguente pezzo di codice per caricare un file in Sharepoint. Esso utilizza HTTP PUT:Caricamento di file nella libreria di documenti Sharepoint (WSS 3.0) tramite HTTP PUT

public static string UploadFile(string destUrl, string sourcePath) 
     { 
      try 
      { 
       Uri destUri = new Uri(destUrl); 
       FileStream inStream = File.OpenRead(sourcePath); 
       WebRequest req = WebRequest.Create(destUri); 
       req.Method = "PUT"; 
       req.Headers.Add("Overwrite", "F"); 
       req.Timeout = System.Threading.Timeout.Infinite; 
       req.Credentials = CredentialCache.DefaultCredentials; 
       Stream outStream = req.GetRequestStream(); 
       string status = CopyStream(inStream, outStream); 
       if (status == "success") 
       { 
        outStream.Close(); 
        WebResponse ores = req.GetResponse(); 
        return "success"; 
       } 
       else 
       { 
        return status; 
       } 
      } 
      catch (WebException we) 
      { 
      return we.Message; 
      } 
      catch (System.Exception ee) 
      { 
      return ee.Message; 
      } 
     } 

Quando eseguo questo codice ottengo l'eccezione:

"The remote server returned an error: (409) Conflict."

Qualcuno ha qualche idea su dove sto andando male?

Grazie,

Alex

+0

Ho appena affrontato lo stesso problema - controlla che gli URL siano validi! – Rashack

+0

C# noob chiede: da dove proviene CopyStream? –

+2

È una derivazione di CopyRiver – Amicable

risposta

8

Ho riscontrato questo problema quando facevo riferimento all'URL della raccolta documenti e non al file di destinazione.

cioè provare http://server nome della libreria/documento name.doc nome nuovo file/

+0

Ho avuto lo stesso problema e la tua soluzione funziona perfettamente. Semplice ed efficiente. – Antoine

+0

Proprio così. Saluti! – leeand00

0

C'è una ragione particolarmente raffinata non si può semplicemente utilizzare l'API Sharepoint (ad es. SPFolder.Files.Add) per caricare il file? Come segue:

http://msdn.microsoft.com/en-us/library/ms454491.aspx

public void UploadFile(string srcUrl, string destUrl) 
{ 
    if (! File.Exists(srcUrl)) 
    { 
     throw new ArgumentException(String.Format("{0} does not exist", 
      srcUrl), "srcUrl"); 
    } 

    SPWeb site = new SPSite(destUrl).OpenWeb(); 

    FileStream fStream = File.OpenRead(srcUrl); 
    byte[] contents = new byte[fStream.Length]; 
    fStream.Read(contents, 0, (int)fStream.Length); 
    fStream.Close(); 

    EnsureParentFolder(site, destUrl); 
    site.Files.Add(destUrl, contents); 
} 
+5

Questo approccio non richiede l'esecuzione del codice sul server? Penso che la domanda riguardi la pubblicazione su http. – msulis

0

Alex, Questo è accaduto anche a me. Probabilmente dovresti creare un'altra libreria illuminata o documentale e caricare file per testare.

È possibile controllare la variabile "destUri" per vedere se punta esattamente alla lista di condivisioni prevista.

La mia situazione è che inizialmente ho creato una raccolta documenti "Requrements", c'è un errore di battitura, quindi ho cambiato il titolo in "Requisiti". Si dovrebbe notare che sharepoint mantiene ancora l'URL a questo elenco come http://server:port/Requrements

Questa è un'eccezione. Speriamo che aiuti.

1

Prova:

void StorePlainFile(string target_url, string filename, byte[] file_bytes) 
{ 
     string url = target_url + "/" + filename; 
     System.Net.WebClient client = new System.Net.WebClient(); 
     client.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     client.Headers.Add("Overwrite", "F"); 
     byte[] response = client.UploadData(url, "PUT", file_bytes); 
} 
1

Non ho ancora risolto il mio problema, è per questo che sono qui, ma so perché stai ricevendo questo errore

L'errore si verifica perché non si imposta un campo nascosto, ma richiesto. Nel mio caso, non avevo colonne e certamente nessuna richiesta. Tuttavia, esiste un campo di controllo delle versioni in conflitto.

Il mio intento è 1) caricare il documento e 2) impostare i metadati del documento. 1) e 2) si verificano su chiamate HTTP separate. Idealmente, voglio farlo in una sola chiamata, ma non so come farlo.

Per eseguire questa operazione, 1) ha esito positivo, quindi il documento viene visualizzato nella libreria. Quindi quando provo ad aggiornare i metadati, è quando ottengo l'errore 409.

Sono abbastanza sicuro di dover prima inserire un passaggio tra 1) e 2) che prima scarica l'elenco del documento (o manifest) che in teoria contiene le informazioni sulla versione necessarie. Tutto quello che dovrei fare è impostare i campi dei metadati di cui ho bisogno e inviarli al server.

No, non vogliamo utilizzare l'API di Sharepoint perché non ci sono librerie per esso in Java. ;-)