2014-12-19 7 views
6

मैं सी # से सीधे अपने ऑनड्राइव खाते में एक डॉक्टर, डॉक्क्स, पीपीटीएक्स या एक्सेल फ़ाइल बनाना चाहता हूं। मैंने कोशिश की है लेकिन यह मेरे लिए काम नहीं कर रहा है। किसी को भी कोई विचार है कि मैंने क्या गलत किया? धन्यवादसी # से प्रोग्रामेटिक रूप से Onedrive पर फ़ाइल बनाएँ?

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(); 
} 

संपादित: त्रुटि है कि मैं मिलता है इस एक:

"शीर्षक 'सामग्री-प्रकार' आवश्यक पैरामीटर याद आ रही है:। 'सीमा' विवरण: एक अनियंत्रित अपवाद घटित वर्तमान वेब अनुरोध के निष्पादन के दौरान। कृपया त्रुटि के बारे में अधिक जानकारी के लिए स्टैक ट्रेस की समीक्षा करें और यह कोड में कहां से उत्पन्न हुआ। अपवाद विवरण: Microsoft.Live.LiveConnectException: शीर्षलेख 'सामग्री-प्रकार' में आवश्यक पैरामीटर गुम है : 'सीमा'।"

+5

त्रुटि संदेश, वास्तव में क्या काम नहीं करता है? –

+0

सुनिश्चित करें कि आप लाइव एसडीके 5.6 बाइनरी का उपयोग करने के लिए अपडेट हैं। – sagar43

+0

मैंने उस त्रुटि संदेश को पोस्ट किया जो मुझे मिलता है और पहले से ही 5.6 अपडेट (यह लाइव एसडीके के संस्करण की वजह से नहीं है) – CalinCosmin

उत्तर

1

अंत में मैं C# से एक docx फ़ाइल बना देता हूं। मैंने यहां समाधान दिया है (विधि से कोड को दोबारा नहीं किया गया है, इसलिए इसे गंभीर तरीकों से विभाजित किया जा सकता है)।

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

मैं माइक्रोसॉफ्ट कैसे प्राप्त करूं। लाइव डीएल? –

+0

nuget पैकेज प्रबंधक कंसोल के माध्यम से। वहां जांचें और आपको OneDrive SDK – CalinCosmin

+0

मिलेगा मैं फैब में इस पर काम कर रहा था। replay के लिए बीटीडब्ल्यू thnx :) –

2

योग्य कुछ बातें:

  1. PostAsync लिए प्रदान की जाती शब्दकोश केवल अनुरोध शरीर में फ़ील्ड का निर्माण, और इसलिए सामग्री प्रकार जोड़ने में कोई प्रभाव
  2. फ़ाइल संसाधनों मतलब हैं नहीं है अपलोडएसिंक विधि का उपयोग करके बनाया जाना है, जिसके लिए सामग्री की आवश्यकता है। मुझे विश्वास नहीं है कि एक एपीआई है जिसे आप रिक्त कार्यालय दस्तावेज़ बनाने के लिए सेवा बताने के लिए बुला सकते हैं।
+0

मैंने अपलोडएसिंक() का उपयोग करके ऑनड्राइव में शब्द, एक्सेल और कई अन्य दस्तावेज़ अपलोड करने के लिए सफलता प्राप्त की। यहां एक उदाहरण दिया गया है कि मैंने विधि को कैसे बुलाया: "LiveOperationResult uploadResult = connectaitClient.UploadAsync (folderId, fileName, fileStream, OverwriteOption.Overwrite) का इंतजार है;" जहां फ़ोल्डर आईडी = "मुझे/स्काईडाइव", fileName = "Document.docx", filestream = इनपुट के स्ट्रीमस्ट्रीम जो मैंने अपने कंप्यूटर से उठाया है और इसने ऑनड्राइव में दस्तावेज़ फ़ाइल बनाई है। मुझे लगता है कि "fileStream" में सामग्री स्वचालित रूप से टाइप की गई है, इसलिए मुझे लगता है कि इसे मैन्युअल रूप से सेट करने का एक तरीका होना चाहिए। – CalinCosmin

1

मेरे पास कुछ और है। मैंने एक HttpWebRequest बनाया और मैंने कुछ पैरामीटर सेट किए। अब यह मेरे ऑनड्राइव खाते में फ़ाइल को डॉक्क्स के रूप में बनाते हैं, लेकिन जब मैं अपने खाते से फ़ाइल खोलने का प्रयास करता हूं तो एक त्रुटि संदेश दिखाई देता है और यह कुछ कह रहा है "कुछ गलत हुआ है। हम फ़ाइल नहीं खोल सके"। फ़ाइल मौजूद है लेकिन यह खुला नहीं हो सकता है।

जो कोड मैंने लिखा है वह यह है। कोई सुझाव ?

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

मैंने 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(); 
     } 
संबंधित मुद्दे