2014-12-19 18 views
6

Voglio creare un file doc, docx, pptx o excel da C# direttamente al mio account Onedrive. Ho provato questo ma non funziona per me. Qualcuno ha idea di cosa ho fatto di sbagliato? GrazieCrea file su Onedrive a livello di codice da C#?

public async Task<ActionResult> CreateWordFile() 
{ 
    LiveLoginResult loginStatus = await authClient.InitializeWebSessionAsync(HttpContext); 
    if (loginStatus.Status == LiveConnectSessionStatus.Connected) 
    { 
     var fileData = new Dictionary<string, object>(); 
     fileData.Add("name", "Document.docx"); 
     fileData.Add("Content-Type", "multipart/form-data; boundary=A300x"); 
     fileData.Add("type", "file"); 

     LiveOperationResult getResult = await connectedClient.PostAsync("me/skydrive/files", fileData); 
    } 

    return View(); 
} 

CURA: L'errore che ottengo è questo:

"L'intestazione 'Content-Type' manca il parametro desiderato:. 'Confine' Descrizione: Si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente Rivedere la traccia dello stack per ulteriori informazioni sull'errore e la relativa origine nel codice. Dettagli eccezione: Microsoft.Live.LiveConnectException: nell'intestazione 'Content-Type' manca il parametro richiesto : 'confine'. "

+5

Messaggi di errore, cosa non funziona esattamente? –

+0

Assicurati di essere aggiornato per utilizzare il binario Live SDK 5.6. – sagar43

+0

Inserisco nel messaggio il messaggio di errore che ottengo e ho già avuto l'aggiornamento 5.6 (non è a causa della versione di Live SDK) – CalinCosmin

risposta

1

Infine creo un file docx da C#. Metto qui la soluzione (il codice del metodo non è refactored quindi può essere diviso in un metodo severo).

public async Task<ActionResult> CreateWordFile() 
{ 
    LiveLoginResult loginStatus = await authClient.InitializeWebSessionAsync(HttpContext); 
    if (loginStatus.Status == LiveConnectSessionStatus.Connected) 
    { 
     connectedClient = new LiveConnectClient(this.authClient.Session); 
     string url = "https://apis.live.net/v5.0/me/skydrive/files?access_token=" + this.authClient.Session.AccessToken; 

     MemoryStream streamDoc = new MemoryStream(); 
     DocX doc = DocX.Create(streamDoc); 

     string headlineText = "Constitution of the United States"; 
     string paraOne = "" 
      + "We the People of the United States, in Order to form a more perfect Union, " 
      + "establish Justice, insure domestic Tranquility, provide for the common defence, " 
      + "promote the general Welfare, and secure the Blessings of Liberty to ourselves " 
      + "and our Posterity, do ordain and establish this Constitution for the United " 
      + "States of America."; 

     // A formatting object for our headline: 
     var headLineFormat = new Formatting(); 
     headLineFormat.FontFamily = new System.Drawing.FontFamily("Arial Black"); 
     headLineFormat.Size = 18D; 
     headLineFormat.Position = 12; 

     // A formatting object for our normal paragraph text: 
     var paraFormat = new Formatting(); 
     paraFormat.FontFamily = new System.Drawing.FontFamily("Calibri"); 
     paraFormat.Size = 10D; 

     doc.InsertParagraph(headlineText, false, headLineFormat); 
     doc.InsertParagraph(paraOne, false, paraFormat); 

     doc.Save(); 

     var docFile = File(streamDoc, "application/octet-stream", "FileName.docx"); 
     MemoryStream streamFile = new MemoryStream(); 
     docFile.FileStream.Position = 0; 
     docFile.FileStream.CopyTo(streamFile); 

     var bites = streamFile.ToArray(); 
     Stream stream2 = new MemoryStream(bites); 

     try 
     { 
      LiveOperationResult getResult = await connectedClient.UploadAsync("me/skydrive", docFile.FileDownloadName, stream2, OverwriteOption.Overwrite); 
     } 
     catch(WebException ex) 
     { 

     } 
    } 

    return View("~/Views/Auth/EditFile.cshtml"); 
} 
+0

come posso ottenere Microsoft.Live dll? –

+0

Tramite la console del gestore pacchetti nuget. Controlla lì e troverai l'SDK OneDrive – CalinCosmin

+0

Stavo lavorando a questo in Fab. btw thnx per replay :) –

2

Un paio di cose:

  1. Il dizionario fornito PostAsync popola solo i campi nel corpo della richiesta, e quindi l'aggiunta di Content-Type in là non hai alcun effetto
  2. risorse file sono media da creare utilizzando il metodo UploadAsync, che richiede il contenuto. Non credo ci sia un'API che puoi chiamare per dire al servizio di creare un documento di Office vuoto.
+0

Ho avuto la possibilità di caricare word, Excel e molti altri documenti in onedrive utilizzando UploadAsync(). Ecco un esempio di come ho chiamato il metodo: "LiveOperationResult uploadResult = Attendi connectedClient.UploadAsync (folderId, fileName, fileStream, OverwriteOption.Overwrite);" dove folderId = "me/skydrive", fileName = "Document.docx", filestream = l'inputStream del file che ho scelto dal mio computer e ha creato il file doc in onedrive. Credo che in "fileStream" sia impostato automaticamente contentType, quindi penso che dovrebbe essere un modo per impostarlo manualmente. – CalinCosmin

1

Ho qualcos'altro. Ho creato un HttpWebRequest e ho impostato alcuni parametri. Ora crea il file sul mio account onedrive come docx, ma quando provo ad aprire il file dal mio account appare un messaggio di errore che dice qualcosa come "È successo qualcosa di sbagliato. Impossibile aprire il file". Il file esiste ma non può essere aperto.

Il codice che ho scritto è questo. Eventuali suggerimenti ?

public async Task<ActionResult> CreateWordFile() 
{ 
    string body = "--A300x\r\n" 
      + "Content-Disposition: form-data; name=\"file\"; filename=\"csm.docx\"\r\n" 
      + "Content-Type: application/octet-stream\r\n" 
      + "\r\n" 
      + "This is some content\r\n" 
      + "\r\n" 
      + "--A300x--\r\n"; 

    byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(body); 
    Stream stream = new MemoryStream(fileBytes); 

    LiveLoginResult loginStatus = await authClient.InitializeWebSessionAsync(HttpContext); 
    if (loginStatus.Status == LiveConnectSessionStatus.Connected) 
    { 
     connectedClient = new LiveConnectClient(this.authClient.Session); 
     string url = "https://apis.live.net/v5.0/me/skydrive/files?access_token=" + this.authClient.Session.AccessToken; 


     HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url); 
     httpWebRequest2.ContentType = "multipart/form-data; boundary=A300x"; 
     httpWebRequest2.Method = "POST"; 
     httpWebRequest2.KeepAlive = true; 
     httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     httpWebRequest2.ContentLength = fileBytes.Length; 
     Stream stream2 = httpWebRequest2.GetRequestStream(); 
     stream2.Write(fileBytes, 0, fileBytes.Length); 
     WebResponse webResponse2 = httpWebRequest2.GetResponse(); 
     } 

    return View(); 
} 
1

Ho anche la risposta per creare un file xlsx.

public async Task<ActionResult> CreateExcelFile() 
     { 
      LiveLoginResult loginStatus = await authClient.InitializeWebSessionAsync(HttpContext); 
      if (loginStatus.Status == LiveConnectSessionStatus.Connected) 
      { 
       connectedClient = new LiveConnectClient(this.authClient.Session); 
       string url = "https://apis.live.net/v5.0/me/skydrive/files?access_token=" + this.authClient.Session.AccessToken; 

       XSSFWorkbook wb = new XSSFWorkbook(); 

       // create sheet 
       XSSFSheet sh = (XSSFSheet)wb.CreateSheet("Sheet1"); 
       // 10 rows, 10 columns 
       for (int i = 0; i < 100; i++) 
       { 
        var r = sh.CreateRow(i); 
        for (int j = 0; j < 100; j++) 
        { 
         r.CreateCell(j); 
        } 
       } 

       MemoryStream stream = new MemoryStream(); 
       wb.Write(stream); 
       stream.Dispose(); 

       var arrBites = stream.ToArray(); 

       MemoryStream newStream = new MemoryStream(arrBites); 

       var docFile = File(newStream, "application/octet-stream", "Excel.xlsx"); 
       MemoryStream streamFile = new MemoryStream(); 
       docFile.FileStream.Position = 0; 
       docFile.FileStream.CopyTo(streamFile); 

       var bites = streamFile.ToArray(); 
       Stream stream2 = new MemoryStream(bites); 

       try 
       { 
        LiveOperationResult getResult = await connectedClient.UploadAsync("me/skydrive", docFile.FileDownloadName, stream2, OverwriteOption.Overwrite); 
       } 
       catch (WebException ex) 
       { 

       } 
      } 
      return View(); 
     }