2016-01-18 11 views
9

मेरे पिछले प्रश्न: How to return file from ASP.net 5 web apiASP.NET 5 जाल एपीआई से फ़ाइल लौटें

मैं वेब एपीआई पोस्ट अनुरोध से प्रतिक्रिया के रूप में एक फाइल वापस जाने के लिए कोशिश कर रहा हूँ।

मैं dnx451 ढांचे और आरसी 1-फाइनल बिल्ड का उपयोग कर रहा हूं। नियंत्रक विधि:

[HttpPost("")] 
public ActionResult Post([FromBody]DocumentViewModel vm) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 

      var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name); 
      var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields); 
      var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content)); 
      FileStream stream = new FileStream(file,FileMode.Open); 

      return File(stream, "application/pdf", "test.pdf"); 

     } 

    } 
    catch (Exception ex) 
    { 
     Response.StatusCode = (int)HttpStatusCode.BadRequest; 
     return null; 
    } 
    Response.StatusCode = (int)HttpStatusCode.BadRequest; 
    return null; 

} 

परिणामस्वरूप मुझे "प्रतिक्रिया" नाम वाली फ़ाइल मिलती है। इसे पीडीएफ के रूप में सहेजने के बाद मैं इसे खोलने की कोशिश करता हूं, और यह कहता है कि यह क्षतिग्रस्त है। क्या आपसे मुझे मदद मिल सकती है। मैं पोस्टमैन का परीक्षण क्लाइंट के रूप में उपयोग कर रहा हूं।

धन्यवाद

+0

जब आप इस डिबग, कोड 'वापसी फ़ाइल()' सीमा तक पहुंच जाती है? प्रतिक्रिया में प्राप्त सामग्री और शीर्षलेख क्या है? – David

+0

क्या आपकी 'हेल्पर.जेनरेट पीडीएफ()' लाइन सही तरीके से काम कर रही है? 'फाइल' का मूल्य क्या है? क्या फ़ाइल खोला जा सकता है, और आपने ब्राउज़र पर वापस भेजने से पहले फ़ाइल उत्पन्न होने का निरीक्षण किया था? –

+0

हाँ पीडीएफ उत्पन्न होता है, और मैं फाइल एक्सप्लोरर से उत्पन्न पीडीएफ फ़ाइल खोल सकता हूं और यह ठीक है। –

उत्तर

18

कृपया अन्य पोस्ट में मेरा उत्तर देखें: Return file as response

संदर्भ के लिए, मैं इस को अपनी आवश्यकताओं फिट बैठता है लगता है:

public FileResult TestDownload() 
{ 
    HttpContext.Response.ContentType = "application/pdf"; 
    FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes("YOUR PATH TO PDF"), "application/pdf") 
    { 
     FileDownloadName = "test.pdf" 
    }; 

    return result;         
} 
+0

परिणाम अभी भी वही है। प्रतिक्रिया "प्रतिक्रिया" नामक फ़ाइल लौटाती है। अगर मैं इसे somthing.pdf में बदलता हूं और इसे खोलने की कोशिश करता हूं - यह अभी भी क्षतिग्रस्त है। –

+0

मैंने स्थानीय पीडीएफ के साथ स्थानीय रूप से उस कोड का परीक्षण किया है और फ़ाइल ठीक से डाउनलोड की गई है और मैं इसे खोल सकता हूं। क्या पीडीएफ पथ आपकी मशीन पर स्थानीय है, या आप इसे गतिशील रूप से या कुछ उत्पन्न कर रहे हैं? जहां मैंने 'पीडीएफ में आपका पाथ' कहा है, तो आपको एक्सटेंशन भी शामिल करना होगा। –

+0

मूल रूप से मैं इसे बना रहा हूं लेकिन एटीएम मैं स्थानीय फाइल के साथ परीक्षण कर रहा हूं। हाँ। पीडीएफ शामिल है। मुझे लगता है कि यह पोस्टमैन मुद्दा हो सकता है। –

9

मैं सिर्फ इस समस्या थी और मिल गया है एक उपाय। जब तक आप अपने फाइल करने के लिए एक पूर्ण पथ के रूप में है, तो आप Response पर एक PhysicalFileResult लौट सकते हैं और स्पष्ट रूप से सेट Content-Disposition हैडर, इसलिए जैसे:

[HttpGet("{key}")] 
public IActionResult Get(string key) 
{ 
    var file = _files.GetPath(key); 

    var result = PhysicalFile(file.Path, "text/text"); 

    Response.Headers["Content-Disposition"] = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = file.Name 
    }.ToString(); 

    return result; 
} 

PhysicalFile का उपयोग करना भी लाभ यह है कि सभी की अतुल्यकालिक स्ट्रीमिंग का है बाइट्स और इतने पर ढांचे द्वारा ख्याल रखा जाता है।

3

FileStreamResult क्रिया परिणाम का उपयोग करने पर विचार करना शायद बेहतर है।

इसका लाभ यह नहीं है कि पूरी फ़ाइल सामग्री को स्मृति में रखा जाए, जो फ़ाइल के आकार, यातायात के स्तर आदि के आधार पर स्केल की समस्याओं का कारण बन सके।

कुछ इस तरह:

[HttpGet] 
public FileStreamResult DownloadFile() 
{ 
    var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name); 
    var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields); 
    var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content)); 
    var stream = new FileStream(file,FileMode.Open); 
    return new FileStreamResult(stream, "application/pdf") 
    { 
     FileDownloadName = "test.pdf" 
    }; 
} 
+0

एमवीसी से फ़ाइलस्ट्रीम रीसेट नहीं है? – Tobias

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