2013-01-31 18 views
7

मेरे पास एक डॉक्क्स फ़ाइल है जिसे मैं संपादन करने के बाद वापस लौटना चाहूंगा। मैं निम्नलिखित कोड है ...मैं मेमोरीस्ट्रीम डॉक्क्स फ़ाइल एमवीसी कैसे वापस कर सकता हूं?

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

फ़ाइल ठीक लग रहा है, लेकिन मैं (त्रुटि संदेश मिल रहा है "फ़ाइल भ्रष्ट जा रहा है" और एक अन्य बताते हुए "शब्द अपठनीय सामग्री नहीं मिली। तुम पर भरोसा है, तो स्रोत हाँ क्लिक करें")। कोई विचार?

अग्रिम धन्यवाद

संपादित

यह मेरा मॉडल में ChangeFile है ...

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

क्या आप डाउनलोड के बिना सीधे "~/दस्तावेज़/savedFile.docx" पर फ़ाइल खोल सकते हैं? यदि हां, तो मुद्दा एक अपूर्ण/भ्रष्ट डाउनलोड है। यदि नहीं, तो आपको हमें दिखाने की जरूरत है कि 'repo.ChangeFile' के अंदर क्या हो रहा है। –

+0

आपके विवरण से ऐसा लगता है कि आपके द्वारा किए गए परिवर्तन सही तरीके से नहीं किए जा रहे हैं। –

+2

ध्यान दें कि 'MemoryStream.ToArray()' विधि है जिसे आपको 'GetBuffer() 'का उपयोग करने की आवश्यकता नहीं है। – Lloyd

उत्तर

13

मैं का प्रयोग कर एक 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

नहीं MemoryStream.GetBuffer().ToArray() उपयोग का उपयोग करें MemoryStream.ToArray()

कारण GetBuffer() मेमोरी स्ट्रीम बनाने के लिए उपयोग की गई सरणी से संबंधित है और स्मृति स्ट्रीम में वास्तविक डेटा नहीं है। अंडरलेइंग सरणी वास्तव में आकार में भिन्न हो सकती है।

MSDN पर छिपे हुए:

ध्यान दें कि बफर आवंटित बाइट्स जो अप्रयुक्त हो सकती है। उदाहरण के लिए, यदि स्ट्रिंग "टेस्ट" मेमोरीस्ट्रीम ऑब्जेक्ट में लिखा गया है, तो GetBuffer से लौटा बफर की लंबाई 256 है, 4, 252 बाइट्स का उपयोग नहीं किया गया है। बफर में केवल डेटा प्राप्त करने के लिए, ToArray विधि का उपयोग करें; हालांकि, ToArray मेमोरी में डेटा की एक प्रति बनाता है।

+0

आपके उत्तर ने मेरी बग हल की: मैंने गेटबफर का उपयोग किया और अंतिम पंक्ति के रूप में एनयूएलएल की एक बड़ी रेखा प्राप्त कर रहा था। ToArray के साथ GetBuffer को बदलकर इसे हल किया! धन्यवाद! – Alonzzo2

संबंधित मुद्दे