2013-01-31 19 views
7

Ho un file docx che vorrei restituire dopo aver apportato delle modifiche. Ho il seguente codice ...Come posso restituire un file docx di MemoryStream MVC?

object useFile = Server.MapPath("~/Documents/File.docx"); 
object saveFile = Server.MapPath("~/Documents/savedFile.docx"); 
MemoryStream newDoc = repo.ChangeFile(useFile, saveFile); 
return File(newDoc.GetBuffer().ToArray(), "application/docx", Server.UrlEncode("NewFile.docx")); 

il file sembra bene, ma sto ottenendo i messaggi di errore ("il file essere corrotti" e un altro che indica "Parola trovato contenuto illeggibile. Se si considera attendibile l'origine fare clic su Sì"). Qualche idea?

Grazie in anticipo

EDIT

Questa è la ChangeFile nel mio modello ...

public MemoryStream ChangeFile(object useFile, object saveFile) 
    { 
     byte[] byteArray = File.ReadAllBytes(useFile.ToString()); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      ms.Write(byteArray, 0, (int)byteArray.Length); 
      using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(ms, true)) 
      {      
       string documentText; 
       using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
       { 
        documentText = reader.ReadToEnd(); 
       } 

       documentText = documentText.Replace("##date##", DateTime.Today.ToShortDateString()); 
       using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
       { 
        writer.Write(documentText); 
       } 
      } 
      File.WriteAllBytes(saveFile.ToString(), ms.ToArray()); 
      return ms; 
     } 
    } 
+2

È possibile aprire il file in "~/Documents/savedFile.docx" direttamente in Word senza il download? Se sì, il problema è un download incompleto/corrotto. Altrimenti, è necessario mostrarci cosa succede all'interno di 'repo.ChangeFile'. –

+0

Dalla tua descrizione sembra che le modifiche che hai apportato non vengano eseguite correttamente. –

+2

Si noti che esiste un metodo 'MemoryStream.ToArray()' che non è necessario utilizzare 'GetBuffer()'. – Lloyd

risposta

13

Io uso un FileStreamResult:

var cd = new System.Net.Mime.ContentDisposition 
    { 
     FileName = fileName, 

     // always prompt the user for downloading, set to true if you want 
     // the browser to try to show the file inline 
     Inline = false, 
    }; 
Response.AppendHeader("Content-Disposition", cd.ToString()); 

return new FileStreamResult(documentStream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
6

non lo fanno utilizzare l'uso MemoryStream.GetBuffer().ToArray()MemoryStream.ToArray().

Il motivo per cui è GetBuffer() si riferisce alla matrice utilizzata per creare il flusso di memoria e non i dati effettivi nel flusso di memoria. La matrice sottostante potrebbe effettivamente differire in termini di dimensioni.

nascoste sul MSDN:

noti che il buffer contiene byte allocati che potrebbero essere inutilizzate. Ad esempio, se la stringa "test" è scritta nell'oggetto MemoryStream , la lunghezza del buffer restituito da GetBuffer è 256, non 4, con 252 byte inutilizzati. Per ottenere solo i dati nel buffer, utilizzare il metodo ToArray; tuttavia, ToArray crea una copia dei dati nella memoria .

+0

La tua risposta ha risolto il mio errore: ho usato GetBuffer e ricevevo un'enorme linea di NULL come ultima riga. sostituendo GetBuffer con ToArray risolto! Grazie! – Alonzzo2

Problemi correlati