2013-01-31 34 views
7

Tôi có một tệp docx mà tôi muốn trả lại sau khi tôi thực hiện chỉnh sửa. Tôi có đoạn code sau đây ...Làm thế nào để tôi trả về tệp MVX MemoryStream docx?

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")); 

Các tập tin có vẻ tốt đẹp, nhưng tôi nhận được thông báo lỗi ("các tập tin bị hỏng" và một tuyên bố "Lời tìm thấy nội dung không đọc được. Nếu bạn tin tưởng vào nguồn bấm Yes"). Bất kỳ ý tưởng?

Cảm ơn trước

EDIT

Đây là ChangeFile trong Model của tôi ...

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

Bạn có thể mở tệp tại "~/Documents/savedFile.docx" trực tiếp trong Word mà không tải xuống không? Nếu có, vấn đề là một tải xuống không đầy đủ/bị hỏng. Nếu không, bạn cần hiển thị cho chúng tôi những gì đang xảy ra bên trong 'repo.ChangeFile'. –

+0

Từ mô tả của bạn, có vẻ như những thay đổi bạn đã thực hiện không được thực hiện chính xác. –

+2

Lưu ý rằng có một phương thức 'MemoryStream.ToArray()' bạn không cần sử dụng 'GetBuffer()'. – Lloyd

Trả lời

13

tôi sử dụng một 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

Đừng sử dụng MemoryStream.GetBuffer().ToArray() sử dụng MemoryStream.ToArray().

Lý do tại sao GetBuffer() liên quan đến mảng được sử dụng để tạo luồng bộ nhớ chứ không phải dữ liệu thực tế trong luồng bộ nhớ. Mảng underlaying có thể khác nhau về kích thước.

Thành viên ẩn danh trên MSDN:

Lưu ý rằng bộ đệm chứa byte được phân bổ mà có thể được sử dụng. Ví dụ: nếu chuỗi "kiểm tra" được ghi vào đối tượng MemoryStream , độ dài của bộ đệm được trả về từ GetBuffer là 256, không phải là 4, với 252 byte không được sử dụng. Để chỉ lấy dữ liệu trong bộ đệm, sử dụng phương thức ToArray ; tuy nhiên, ToArray tạo một bản sao của dữ liệu trong bộ nhớ .

+0

Câu trả lời của bạn đã giải quyết được lỗi của tôi: Tôi đã sử dụng GetBuffer và đang nhận được một dòng lớn NULL như dòng cuối cùng. thay thế GetBuffer bằng ToArray đã giải quyết nó! cảm ơn! – Alonzzo2