2017-12-07 5 views
0

Ich erstelle ein Add-In für Word, mit dem Ziel, das geöffnete Word-Dokument in unserer MVC-Webanwendung speichern zu können. Ich habe this guide gefolgt und schicke die Scheiben wie folgt aus:Office-/Word-Add-in Hochladen von Dateien in MVC-Anwendung

function sendSlice(slice, state) { 
    var data = slice.data; 

    if (data) { 
     var fileData = myEncodeBase64(data);  
     var request = new XMLHttpRequest(); 

     request.onreadystatechange = function() { 
      if (request.readyState == 4) { 

       updateStatus("Sent " + slice.size + " bytes."); 
       state.counter++; 

       if (state.counter < state.sliceCount) { 
        getSlice(state); 
       } 
       else { 
        closeFile(state); 
       } 
      } 
     } 
     request.open("POST", "http://localhost:44379/api/officeupload/1"); 
     request.setRequestHeader("Slice-Number", slice.index); 
     request.setRequestHeader("Total-Slices", state.sliceCount); 
     request.setRequestHeader("FileId", "abc29572-8eca-473d-80de-8b87d64e06a0"); 
     request.setRequestHeader("FileName", "file.docx"); 

     request.send(fileData); 
    } 
} 

Und dann die Scheiben wie folgt empfangen:

public void Post() 
    { 
     if (Files == null) Files = new Dictionary<Guid, Dictionary<int, byte[]>>(); 

     var slice = int.Parse(Request.Headers.GetValues("Slice-Number").First()); 
     var numSlices = int.Parse(Request.Headers.GetValues("Total-Slices").First()); 
     var filename = Request.Headers.GetValues("FileName").First(); 
     var fileId = Guid.Parse(Request.Headers.GetValues("FileId").First()); 

     var content = Request.Content.ReadAsStringAsync().Result; 

     if (!Files.ContainsKey(fileId)) Files[fileId] = new Dictionary<int, byte[]>(); 
     Files[fileId][slice] = Convert.FromBase64String(content); 

     if (Files[fileId].Keys.Count == numSlices) 
     { 
      byte[] array = Combine(Files[fileId].OrderBy(x => x.Key).Select(x => x.Value).ToArray()); 

      System.IO.FileStream writeFileStream = new System.IO.FileStream("c:\\temp\\test.docx", System.IO.FileMode.Create, System.IO.FileAccess.Write); 
      writeFileStream.Write(array, 0, array.Length); 
      writeFileStream.Close(); 

      Files.Remove(fileId); 
     } 
    } 

Das Problem ist, dass die Datei, die von der Steuerung ist nicht lesbar in Word erzeugt wird . Ich habe mit einem Word-Dokument mit "Test123" als den gesamten Inhalt des Dokuments getestet, und wenn die Datei über Word gespeichert wird, ist es 13kb, aber wenn an die Web-App gesendet und von dort gespeichert wird, ist die Datei 41kb.

Meine Annahme ist, dass ich etwas entweder mit der Codierung oder Decodierung vermisse, da ich nur eine einzige Scheibe sende, so sollte es kein Problem mit der Rekombination geben.

Antwort

0

Es gibt ein Excel-Snippet in Script Lab, das die Base64-kodierte Datei erzeugt, die Sie in einen Online-Decoder wie www.base64decode.org einfügen können. Die APIs sind die gleichen wie in Word. Dies kann Ihnen helfen, den Codierungscode zu isolieren. Nachdem Sie Script Lab installiert haben, öffnen Sie die Registerkarte Beispiele, scrollen Sie zum Abschnitt Dokument. Es ist die Get-Datei (mit Slicing) Snippet.