2009-02-27 11 views
9

Hola Tengo la siguiente pieza de código para cargar un archivo en Sharepoint. Utiliza HTTP PUT:Carga de archivos en la biblioteca de documentos Sharepoint (WSS 3.0) mediante 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; 
      } 
     } 

Cuando ejecuto el código consigo la excepción:

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

¿Alguien tiene alguna idea de a dónde voy mal?

Gracias,

Alex

+0

Acabo de enfrentar el mismo problema: ¡compruebe que las URL sean válidas! – Rashack

+0

Nodo C# pregunta: ¿De dónde viene CopyStream? –

+2

Es una rama del CopyRiver – Amicable

Respuesta

8

Tuve este problema cuando estaba haciendo referencia a la url de la biblioteca de documentos y no al archivo de destino en sí.

es decir, tratar http://server Nombre/biblioteca de documentos name.doc nombre de archivo nuevo/

+0

Tuve el mismo problema y tu solución funciona perfectamente. Simple y eficiente. – Antoine

+0

Sí, eso hizo el truco. ¡Aclamaciones! – leeand00

0

¿Hay alguna razón paticular No se puede simplemente utilizar la API de SharePoint (por ejemplo. SPFolder.Files.Add) para cargar el archivo? En la siguiente manera:

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

¿Este enfoque no requiere ejecutar el código en el servidor? Creo que la pregunta es sobre publicar en http. – msulis

0

Alex, Esto sucedió a mí también. Es probable que deba crear otra biblioteca encendida o documentada y cargar archivos en ella para probarla.

Es posible que desee comprobar la variable "destUri" para ver si apunta exactamente a la lista de puntos compartidos esperados.

Mi situación es que primero creé una biblioteca de documentos "Necesidades", hay un error tipográfico, luego cambié el título a "Requisitos". Debe observar que sharepoint aún conserva la URL a esta lista como http://server:port/Requrements

Esta es una excepción. Espero que ayude

1

Probar:

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

no he resuelto mi problema, sin embargo, es por eso que estoy aquí, pero sé por qué estás recibiendo este error

El error se produce porque no está configurando un campo oculto, pero obligatorio. En mi caso, no tenía columnas, y ciertamente ninguna requerida. Sin embargo, hay un campo de control de versiones que está en conflicto.

Mi intención es 1) cargar el documento, y 2) establecer los metadatos del documento. 1) y 2) ocurren en llamadas HTTP separadas. Idealmente, quiero hacer esto en una sola llamada, pero no sé cómo hacer esto.

Para lograr esto, 1) tiene éxito, por lo que el documento aparece en la biblioteca. Luego, cuando trato de actualizar los metadatos, es cuando recibo el error 409.

Estoy bastante seguro de que primero necesito insertar un paso entre 1) y 2) que primero descarga la lista del documento (o manifiesto) que en teoría contendría la información de control de versiones necesaria. Todo lo que tendría que hacer es establecer los campos de metadatos que necesito y enviar de vuelta al servidor.

No, no queremos utilizar la API Sharepoint porque no hay bibliotecas para ella en Java. ;-)

Cuestiones relacionadas