दिलचस्प पोस्ट
एंड्रॉइड पर समर्थित भाषाओं / लोकेल की सूची क्या है? पुनरावर्ती सूची सपाट एंड्रॉइड इन्टेंट का उपयोग करके एचटीएमएल मेल भेजें 2 तिथियों के बीच एक डाटाफ्रेम सबसेट करें .NET में मेमोरी लीक्स को खोजने के लिए कौन से रणनीतियों और टूल उपयोगी हैं? सॉकेट: जावा का उपयोग कर पोर्ट की उपलब्धता का पता लगाएं जावा: नियम प्रारंभिकरण, घोषणापत्र और असाइनमेंट को परिभाषित करें प्रतिवर्ती "संख्या से द्विआधारी" बिन्दु जावास्क्रिप्ट और PHP फ़ंक्शन जावास्क्रिप्ट इनहेरिटन्स UITableView पृष्ठभूमिकॉलर हमेशा iPad पर ग्रे रहता है अनुरोधों के साथ अजगर में बड़ी फाइल कैसे डाउनलोड करें? LINQ विस्तार विधियों का क्रम प्रदर्शन को प्रभावित नहीं करता है? JQuery और HTML का उपयोग करके सीएसवी में निर्यात करें गैर रिकर्सिव गहराई पहले खोज एल्गोरिथ्म

ASP.NET WebAPI में एक फ़ाइल (FileContentResult) को वापस कैसे करें

एक नियमित MVC नियंत्रक में, हम एक FileContentResult साथ पीडीएफ आउटपुट कर सकते हैं।

 public FileContentResult Test(TestViewModel vm) { var stream = new MemoryStream(); //... add content to the stream. return File(stream.GetBuffer(), "application/pdf", "test.pdf"); } 

लेकिन हम इसे कैसे ApiController में बदल सकते हैं?

 [HttpPost] public IHttpActionResult Test(TestViewModel vm) { //... return Ok(pdfOutput); } 

यहां मैंने जो कोशिश की है, लेकिन यह काम करने में प्रतीत नहीं होता है

 [HttpGet] public IHttpActionResult Test() { var stream = new MemoryStream(); //... var content = new StreamContent(stream); content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); content.Headers.ContentLength = stream.GetBuffer().Length; return Ok(content); } 

ब्राउज़र में प्रदर्शित परिणाम लौटाया गया है:

 {"Headers":[{"Key":"Content-Type","Value":["application/pdf"]},{"Key":"Content-Length","Value":["152844"]}]} 

और एसओ पर समान पद है: ASP.NET वेब एपीआई में नियंत्रक से बाइनरी फ़ाइल रिटर्निंग । यह आउटपुट एक मौजूदा फाइल के बारे में बात करता है लेकिन मैं इसे एक धारा के साथ काम नहीं कर सका।

कोई सुझाव?

वेब के समाधान से एकत्रित समाधान "ASP.NET WebAPI में एक फ़ाइल (FileContentResult) को वापस कैसे करें"

Content रूप में StreamContent Content को लौटने के बजाय, मैं इसे StreamContent Content साथ काम कर सकता हूं।

 [HttpGet] public HttpResponseMessage Generate() { var stream = new MemoryStream(); // processing the stream. var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream.ToArray()) }; result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = "CertificationCard.pdf" }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); return result; } 

यदि आप IHttpActionResult वापस करना चाहते हैं तो आप ऐसा कर सकते हैं:

 [HttpGet] public IHttpActionResult Test() { var stream = new MemoryStream(); var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream.GetBuffer()) }; result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = "test.pdf" }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); var response = ResponseMessage(result); return response; } 

यह प्रश्न मेरी मदद करता है

तो, यह प्रयास करें:

नियंत्रक कोड:

 [HttpGet] public HttpResponseMessage Test() { var path = System.Web.HttpContext.Current.Server.MapPath("~/Content/test.docx");; HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(path, FileMode.Open); result.Content = new StreamContent(stream); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(path); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentLength = stream.Length; return result; } 

एचटीएमएल मार्कअप देखें (क्लिक ईवेंट और सरल यूआरएल के साथ):

 <script type="text/javascript"> $(document).ready(function () { $("#btn").click(function () { // httproute = "" - using this to construct proper web api links. window.location.href = "@Url.Action("GetFile", "Data", new { httproute = "" })"; }); }); </script> <button id="btn"> Button text </button> <a href=" @Url.Action("GetFile", "Data", new { httproute = "" }) ">Data</a> 

मुझे बिल्कुल यकीन नहीं है कि किस भाग का दोष है, लेकिन यहाँ क्यों है MemoryStream आपके लिए काम नहीं करता है:

जैसा कि आप MemoryStream को लिखते हैं, यह इसकी Position संपत्ति बढ़ता है स्ट्रीम StreamContent निर्माता धारा की वर्तमान Position । इसलिए यदि आप स्ट्रीम को लिखते हैं, तो इसे स्ट्रीम StreamContent पास करते हैं, तो स्ट्रीम स्ट्रीम के अंत में शून्य से शुरू हो जाएगी।

ठीक से इसे ठीक करने के दो तरीके हैं:

1) सामग्री का निर्माण, स्ट्रीम को लिखें

 [HttpGet] public HttpResponseMessage Test() { var stream = new MemoryStream(); var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StreamContent(stream); // ... // stream.Write(...); // ... return response; } 

2) स्ट्रीम, रीसेट स्थिति, सामग्री का निर्माण करने के लिए लिखें

 [HttpGet] public HttpResponseMessage Test() { var stream = new MemoryStream(); // ... // stream.Write(...); // ... stream.Position = 0; var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StreamContent(stream); return response; } 

2) यदि आपके पास एक ताजा स्ट्रीम है, तो थोड़ा बेहतर दिखता है 1) सरल है अगर आपकी स्ट्रीम 0 पर शुरू नहीं होती है