asp.net - बटन - समझ एएसपी शुद्ध नियंत्रण




एक एएसपी.नेट एमवीसी नियंत्रक एक छवि वापस कर सकते हैं? (11)

क्या मैं एक नियंत्रक बना सकता हूं जो बस एक छवि संपत्ति देता है?

मैं इस तर्क को नियंत्रक के माध्यम से रूट करना चाहता हूं, जब भी कोई यूआरएल अनुरोध किया जाता है:

www.mywebsite.com/resource/image/topbanner

नियंत्रक topbanner.png को topbanner.png और उस छवि को सीधे ग्राहक को वापस भेज देगा।

मैंने इस उदाहरण को देखा है जहां आपको एक व्यू बनाना है - मैं एक दृश्य का उपयोग नहीं करना चाहता हूं। मैं इसे सिर्फ नियंत्रक के साथ करना चाहता हूं।

क्या यह संभव है?


ContentResult देखें। यह एक स्ट्रिंग देता है, लेकिन इसका उपयोग अपनी खुद की बाइनरी रीसेट जैसी कक्षा बनाने के लिए किया जा सकता है।


आप HttpContext.Response का उपयोग कर सकते हैं और सीधे सामग्री को लिख सकते हैं (WriteFile () आपके लिए काम कर सकता है) और उसके बाद ActionResult की बजाय ContentResult को अपने क्रिया से वापस कर सकता है।

अस्वीकरण: मैंने यह कोशिश नहीं की है, यह उपलब्ध एपीआई को देखने पर आधारित है। :-)


आप फ़ाइल, व्यू, कंटेंट इत्यादि जैसी फाइल लौटने के लिए फाइल का उपयोग कर सकते हैं

 public ActionResult PrintDocInfo(string Attachment)
            {
                string test = Attachment;
                if (test != string.Empty || test != "" || test != null)
                {
                    string filename = Attachment.Split('\\').Last();
                    string filepath = Attachment;
                    byte[] filedata = System.IO.File.ReadAllBytes(Attachment);
                    string contentType = MimeMapping.GetMimeMapping(Attachment);

                    System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
                    {
                        FileName = filename,
                        Inline = true,
                    };

                    Response.AppendHeader("Content-Disposition", cd.ToString());

                    return File(filedata, contentType);          
                }
                else { return Content("<h3> Patient Clinical Document Not Uploaded</h3>"); }

            }

आप सीधे प्रतिक्रिया पर लिख सकते हैं लेकिन फिर यह टेस्टेबल नहीं है। एक एक्शन रिसेट को वापस करना पसंद किया जाता है जिसने निष्पादन स्थगित कर दिया है। यहां मेरा पुन: प्रयोज्य StreamResult है:

public class StreamResult : ViewResult
{
    public Stream Stream { get; set; }
    public string ContentType { get; set; }
    public string ETag { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = ContentType;
        if (ETag != null) context.HttpContext.Response.AddHeader("ETag", ETag);
        const int size = 4096;
        byte[] bytes = new byte[size];
        int numBytes;
        while ((numBytes = Stream.Read(bytes, 0, size)) > 0)
            context.HttpContext.Response.OutputStream.Write(bytes, 0, numBytes);
    }
}

क्यों आसान नहीं है और tilde ~ ऑपरेटर का उपयोग करें?

public FileResult TopBanner() {
  return File("~/Content/images/topbanner.png", "image/png");
}

डायलैंड की प्रतिक्रिया पर थोड़ा सा स्पष्टीकरण देना:

तीन कक्षाएं FileResult कक्षा को लागू करती हैं:

System.Web.Mvc.FileResult
      System.Web.Mvc.FileContentResult
      System.Web.Mvc.FilePathResult
      System.Web.Mvc.FileStreamResult

वे सभी काफी आत्म व्याख्यात्मक हैं:

  • फ़ाइल पथ डाउनलोड के लिए जहां फ़ाइल डिस्क पर मौजूद है, FilePathResult उपयोग करें - यह सबसे आसान तरीका है और आपको स्ट्रीम का उपयोग करने से बचाता है।
  • बाइट [] arrays (Response.BinaryWrite के समान) के लिए, FileContentResult उपयोग करें।
  • बाइट [] arrays के लिए जहां आप फ़ाइल को डाउनलोड करना चाहते हैं (सामग्री-स्वभाव: अनुलग्नक), नीचे दिए गए तरीके से FileStreamResult का उपयोग करें, लेकिन GetBuffer() साथ और GetBuffer() का उपयोग करें।
  • Streams लिए FileStreamResult उपयोग करें। इसे एक फ़ाइलस्ट्रीम रीसेट कहा जाता है लेकिन यह एक Stream लेता है, इसलिए मुझे लगता है कि यह MemoryStream साथ काम करता है।

नीचे सामग्री-स्वभाव तकनीक का उपयोग करने का एक उदाहरण है (परीक्षण नहीं किया गया है):

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult GetFile()
    {
        // No need to dispose the stream, MVC does it for you
        string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "myimage.png");
        FileStream stream = new FileStream(path, FileMode.Open);
        FileStreamResult result = new FileStreamResult(stream, "image/png");
        result.FileDownloadName = "image.png";
        return result;
    }

मुझे दो विकल्प दिखते हैं:

1) अपनी खुद की IViewEngine को कार्यान्वित करें और कंट्रोलर की व्यूइंजिन प्रॉपर्टी सेट करें जिसे आप अपनी वांछित "छवि" विधि में अपनी ImageViewEngine पर उपयोग कर रहे हैं।

2) एक दृश्य का प्रयोग करें :-)। बस सामग्री प्रकार आदि बदलें।


मैंने यहां एक समान प्रश्न पूछा, एएसपी.नेट एमवीसी का उपयोग करके एक निजी फोटो गैलरी बनाना और इसे करने के लिए एक महान मार्गदर्शिका ढूंढना समाप्त हो गया।

मैंने इस गाइड के बाद एक ImageResult कक्षा बनाई है। https://blog.maartenballiauw.be/post/2008/05/13/aspnet-mvc-custom-actionresult.html


यह मेरे लिए काम किया। चूंकि मैं SQL सर्वर डेटाबेस पर छवियों को संग्रहीत कर रहा हूं।

    [HttpGet("/image/{uuid}")]
    public IActionResult GetImageFile(string uuid) {
        ActionResult actionResult = new NotFoundResult();
        var fileImage = _db.ImageFiles.Find(uuid);
        if (fileImage != null) {
            actionResult = new FileContentResult(fileImage.Data,
                fileImage.ContentType);
        }
        return actionResult;
    }

_db.ImageFiles.Find(uuid) ऊपर स्निपेट में डीबी (ईएफ संदर्भ) में छवि फ़ाइल रिकॉर्ड की खोज कर रहा है। यह एक फ़ाइल इमेज ऑब्जेक्ट देता है जो मॉडल के लिए बनाई गई एक कस्टम क्लास है और फिर इसे FileContentResult के रूप में उपयोग करता है।

public class FileImage {
   public string Uuid { get; set; }
   public byte[] Data { get; set; }
   public string ContentType { get; set; }
}

अद्यतन: मेरे मूल उत्तर से बेहतर विकल्प हैं। यह एमवीसी के बाहर काफी अच्छी तरह से काम करता है लेकिन छवि सामग्री लौटने के अंतर्निहित तरीकों से चिपकना बेहतर होता है। ऊपर मतदान जवाब देखें।

आप निश्चित रूप से कर सकते हैं। इन चरणों को आज़माएं:

  1. छवि को डिस्क से बाइट सरणी में लोड करें
  2. यदि आप छवि के लिए अधिक अनुरोध की अपेक्षा करते हैं तो छवि को कैश करें और डिस्क I / O नहीं चाहते (मेरा नमूना इसे नीचे कैश नहीं करता है)
  3. Response.ContentType के माध्यम से माइम प्रकार बदलें
  4. प्रतिक्रिया। बाइनरी छवि बाइट सरणी बाहर लिखें

यहां कुछ नमूना कोड दिया गया है:

string pathToFile = @"C:\Documents and Settings\some_path.jpg";
byte[] imageData = File.ReadAllBytes(pathToFile);
Response.ContentType = "image/jpg";
Response.BinaryWrite(imageData);

उम्मीद है की वो मदद करदे!


if (!System.IO.File.Exists(filePath))
    return SomeHelper.EmptyImageResult(); // preventing JSON GET/POST exception
else
    return new FilePathResult(filePath, contentType);

SomeHelper.EmptyImageResult() को मौजूदा छवि (उदाहरण के लिए 1x1 पारदर्शी) के साथ FileResult वापस करना चाहिए।

यदि आपके पास स्थानीय ड्राइव पर संग्रहीत फ़ाइलें हैं तो यह सबसे आसान तरीका है। अगर फाइल byte[] या stream - तो फ़ाइल FileContentResult या FileStreamResult FileContentResult उपयोग करें जैसा कि डायलन सुझाव दिया गया है।





controller