কোনও এএসপি.এনইটি এমভিসি নিয়ন্ত্রক কী কোনও চিত্র ফিরিয়ে দিতে পারে?


455

আমি কি এমন কোনও নিয়ামক তৈরি করতে পারি যা কেবল একটি চিত্রের সম্পদ ফেরত দেয়?

আমি যখনই নীচের মতো ইউআরএল অনুরোধ করা হয় তখনই আমি এই যুক্তিটিকে একটি নিয়ামকের মাধ্যমে রুট করতে চাই:

www.mywebsite.com/resource/image/topbanner

কন্ট্রোলার অনুসন্ধান করবে topbanner.pngএবং সরাসরি চিত্রটি ক্লায়েন্টের কাছে প্রেরণ করবে ।

আমি এর উদাহরণগুলি দেখেছি যেখানে আপনাকে একটি ভিউ তৈরি করতে হবে - আমি কোনও ভিউ ব্যবহার করতে চাই না। আমি কেবল কন্ট্রোলার দিয়ে এটি সব করতে চাই।

এটা কি সম্ভব?


1
আমি এখানে একটি অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি /programming/155906/creating-a-private-photo-gallery- using- aspnet -mvc এবং এটি করার জন্য একটি দুর্দান্ত গাইড খুঁজে পেয়েছি । আমি এই গাইড অনুসরণ করে একটি চিত্রআরসাল্ট শ্রেণি তৈরি করেছি। https://blog.maartenballiauw.be/post/2008/05/13/aspnet-mvc-custom-actionresult.html
ভাইরোটেক

2
আপনি যদি চিত্রটি সংশোধন করতে চান তবে সর্বোত্তম পারফরম্যান্সের জন্য চিত্র পুনর্নির্মাণ. নেট এইচটিটিপি মড্যুল ব্যবহার করুন। যদি আপনি এটি না করেন তবে কোনও ফাইলপথরেসল্ট ওভারহেডের মাত্র কয়েক শতাংশ যুক্ত করে। ইউআরএল পুনর্লিখন কিছুটা কম যোগ করে।
লিলিথ নদী

1
এমভিসির পরিবর্তে ওয়েবপিপি নিয়ন্ত্রক ব্যবহার করছেন না কেন? ApiController class
এ-শারাবানী

উত্তর:


534

বেস নিয়ন্ত্রণকারী ফাইল পদ্ধতি ব্যবহার করুন Use

public ActionResult Image(string id)
{
    var dir = Server.MapPath("/Images");
    var path = Path.Combine(dir, id + ".jpg"); //validate the path for security or use other means to generate the path.
    return base.File(path, "image/jpeg");
}

একটি নোট হিসাবে, এটি মোটামুটি দক্ষ বলে মনে হচ্ছে। আমি একটি পরীক্ষা করেছি যেখানে আমি কন্ট্রোলার ( http://localhost/MyController/Image/MyImage) এবং সরাসরি ইউআরএল ( http://localhost/Images/MyImage.jpg) এর মাধ্যমে চিত্রটির অনুরোধ করেছি এবং ফলাফলগুলি ছিল:

  • এমভিসি: প্রতি ছবিতে 7.6 মিলিসেকেন্ড
  • সরাসরি: ফটো প্রতি 6.7 মিলিসেকেন্ড

দ্রষ্টব্য: এটি একটি অনুরোধের গড় সময়। স্থানীয় মেশিনে হাজার হাজার অনুরোধ করে গড়ে গণনা করা হত, সুতরাং মোটে নেটওয়ার্কের বিলম্ব বা ব্যান্ডউইথ সমস্যাগুলি অন্তর্ভুক্ত করা উচিত নয়।


10
এখন যারা এই প্রশ্নে আসছেন তাদের ক্ষেত্রে, এটিই আমার জন্য সবচেয়ে কার্যকর কাজটি সমাধান করেছিল।
ক্লারেন্স ক্লোফস্টেইন

177
এটি নিরাপদ কোড নয়। ব্যবহারকারীকে এই জাতীয় কোনও ফাইলের নাম (পথ) পাস করার অর্থ তারা সম্ভবত সার্ভারের যে কোনও জায়গা থেকে ফাইল অ্যাক্সেস করতে পারে। লোকেরা যেমনটি হয় তেমন ব্যবহার না করার জন্য সতর্ক করতে পারে।
ইয়ান মেরার

7
যতক্ষণ না আপনি ফ্লাইতে ফাইলগুলি প্রয়োজনীয় হিসাবে তৈরি করছেন এবং সেগুলি তৈরি হয়ে গেলে তাদের ক্যাশে না করা (এটিই আমরা করি)।
ব্রায়ান

15
@ মারে- আপনি যদি এটি কোনও নিষিদ্ধ স্থান থেকে ফাইলগুলি পরিবেশন করছেন তবে আপনি এটি করতেও পারেন যেমন আপনার ছবিতে App_Dataআপনার অ্যাপ্লিকেশনটির কিছু ব্যবহারকারীদের স্বাক্ষর করা উচিত তবে অন্যদের নয়। তাদের পরিবেশন করতে নিয়ামক পদক্ষেপের ব্যবহার আপনাকে অ্যাক্সেসকে সীমাবদ্ধ করতে দেয়।
রাশ ক্যাম

8
অন্যরা যেমন উল্লেখ করেছে, আপনার পথের বিল্ডিংয়ে সাবধান থাকুন, যেমন আমি প্রকৃত উত্পাদন কোড দেখেছি যা ব্যবহারকারীর সাবধানে নির্মিত পোষ্ট বা ক্যোয়ারিং স্ট্রিং সহ ডিরেক্টরিতে ন্যাভিগেট করতে দেয়: /../../../danger/someFileTheyTHoughtWasInaccessible
অ্যারোনলএস

128

এমভিসির প্রকাশ সংস্করণটি ব্যবহার করে, আমি এখানে যা করছি তা এখানে:

[AcceptVerbs(HttpVerbs.Get)]
[OutputCache(CacheProfile = "CustomerImages")]
public FileResult Show(int customerId, string imageName)
{
    var path = string.Concat(ConfigData.ImagesDirectory, customerId, "\\", imageName);
    return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg");
}

পাথ নির্মাণ সম্পর্কিত আমার কাছে স্পষ্টতই কিছু অ্যাপ্লিকেশন নির্দিষ্ট জিনিস রয়েছে তবে ফাইলস্ট্রিমআরসাল্ট ফিরে আসা খুব সহজ এবং সহজ।

ইমেজটিতে আপনার দৈনন্দিন কল (কন্ট্রোলারকে বাইপাস করে) এর বিরুদ্ধে এই ক্রিয়া সম্পর্কিত আমি কিছু কর্মক্ষমতা পরীক্ষা করেছি এবং গড়গুলির মধ্যে পার্থক্য ছিল প্রায় 3 মিলিসেকেন্ড (কন্ট্রোলার গড়টি 68 মিমি, নন-কন্ট্রোলার ছিল 65 মিমি)।

আমি এখানে বর্ণিত বর্ণিত অন্যান্য কয়েকটি পদ্ধতির চেষ্টা করেছি এবং পারফরম্যান্স হিটটি অনেক বেশি নাটকীয় ছিল ... সমাধানগুলির বেশ কয়েকটি প্রতিক্রিয়া ছিল 6x অ-নিয়ন্ত্রক হিসাবে (অন্যান্য নিয়ামকরা গড় 340 মিমি, নন-কন্ট্রোলার 65 মিমি)।


12
চিত্রটি কী পরিবর্তিত হয় না? শেষ অনুরোধের পর থেকে চিত্রটি সংশোধিত না হলে ফাইল স্ট্রিমারসাল্ট 304 পাঠাতে হবে should
dariol

আপনি Path.Combineনিরাপদ এবং আরও পঠনযোগ্য কোডের জন্য কনকটের পরিবর্তে ব্যবহার করতে পারেন ।
মার্সেল তোথ

101

ডিল্যান্ডের প্রতিক্রিয়াটি সামান্য ব্যাখ্যা করতে:

তিনটি ক্লাস ফাইলআরসাল্ট শ্রেণি প্রয়োগ করে :

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

তারা সবাই মোটামুটি স্ব-বর্ণনামূলক:

  • ফাইলের পাথ ডাউনলোডের জন্য যেখানে ডিস্কে ফাইল উপস্থিত রয়েছে, ব্যবহার করুন FilePathResult- এটি সবচেয়ে সহজতম উপায় এবং আপনাকে স্ট্রিম ব্যবহার করা এড়ানো যায়।
  • বাইটের জন্য [] অ্যারে (রেসপন্সের অনুরূপ। বাইনারিওয়াইট), ব্যবহার করুন FileContentResult
  • বাইট [] অ্যারেগুলির জন্য যেখানে আপনি ফাইলটি ডাউনলোড করতে চান (বিষয়বস্তু-স্বভাব: সংযুক্তি), FileStreamResultনীচে একইভাবে ব্যবহার করুন তবে একটি সহ MemoryStreamএবং ব্যবহার করে 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;
    }

2
এই পোস্টের বিষয়বস্তু-স্বভাবের অংশটি অত্যন্ত সহায়ক ছিল
ডিয়েগো

ভিএস আমাকে বলছে যে ফাইল স্ট্রিম () এর এই ওভারলোডটি অপ্রচলিত।
মিঃবোজ্যাংলেস

1
কিছু লক্ষণীয়: যদি আপনার ফাইলের নামে কমা থাকে তবে ক্রোম এটি একটি "অনেক বেশি শিরোনাম প্রাপ্ত" ত্রুটি দিয়ে প্রত্যাখ্যান করবে। সুতরাং সমস্ত কমা একটি "-" বা "" দিয়ে প্রতিস্থাপন করুন।
ক্রিস এস

কেবলমাত্র ওয়েব এপিআই কন্ট্রোলার ব্যবহার করে কেউ কীভাবে এটি করতে পারে?
Zapnologica

74

আপনি যদি চিত্রটি ফেরত দেওয়ার আগে পরিবর্তন করতে চান তবে এটি সহায়ক হতে পারে:

public ActionResult GetModifiedImage()
{
    Image image = Image.FromFile(Path.Combine(Server.MapPath("/Content/images"), "image.png"));

    using (Graphics g = Graphics.FromImage(image))
    {
        // do something with the Graphics (eg. write "Hello World!")
        string text = "Hello World!";

        // Create font and brush.
        Font drawFont = new Font("Arial", 10);
        SolidBrush drawBrush = new SolidBrush(Color.Black);

        // Create point for upper-left corner of drawing.
        PointF stringPoint = new PointF(0, 0);

        g.DrawString(text, drawFont, drawBrush, stringPoint);
    }

    MemoryStream ms = new MemoryStream();

    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

    return File(ms.ToArray(), "image/png");
}

1
ধন্যবাদ. এটি এমন দৃশ্যের জন্য উপযুক্ত যেখানে ক্লায়েন্টের পক্ষে করা যায় না এমন প্রমাণীকরণের প্রয়োজন এমন একটি চিত্র ডাউনলোড করার জন্য একটি প্রক্সি প্রয়োজন।
হং

1
আপনি একটি বৃহত্ 3 টি দেশীয় বস্তুর নিষ্পত্তি করতে ভুলে যাচ্ছেন: হরফ, সলিডব্রাশ এবং চিত্র।
ওয়াট

3
প্রস্তাবিত উন্নতি এখানে: আপনি একটি মেমরি স্ট্রিম তৈরি করেন, ডেটা লিখুন এবং তারপরে ডেটা দিয়ে একটি ফাইল ফলাফল তৈরি করুন। চিত্র / পিএনজি ") // স্ট্রিমটি নিজেই
ফেরান

12

আপনি নিজের এক্সটেনশন তৈরি করতে পারেন এবং এইভাবে করতে পারেন।

public static class ImageResultHelper
{
    public static string Image<T>(this HtmlHelper helper, Expression<Action<T>> action, int width, int height)
            where T : Controller
    {
        return ImageResultHelper.Image<T>(helper, action, width, height, "");
    }

    public static string Image<T>(this HtmlHelper helper, Expression<Action<T>> action, int width, int height, string alt)
            where T : Controller
    {
        var expression = action.Body as MethodCallExpression;
        string actionMethodName = string.Empty;
        if (expression != null)
        {
            actionMethodName = expression.Method.Name;
        }
        string url = new UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection).Action(actionMethodName, typeof(T).Name.Remove(typeof(T).Name.IndexOf("Controller"))).ToString();         
        //string url = LinkBuilder.BuildUrlFromExpression<T>(helper.ViewContext.RequestContext, helper.RouteCollection, action);
        return string.Format("<img src=\"{0}\" width=\"{1}\" height=\"{2}\" alt=\"{3}\" />", url, width, height, alt);
    }
}

public class ImageResult : ActionResult
{
    public ImageResult() { }

    public Image Image { get; set; }
    public ImageFormat ImageFormat { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        // verify properties 
        if (Image == null)
        {
            throw new ArgumentNullException("Image");
        }
        if (ImageFormat == null)
        {
            throw new ArgumentNullException("ImageFormat");
        }

        // output 
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.ContentType = GetMimeType(ImageFormat);
        Image.Save(context.HttpContext.Response.OutputStream, ImageFormat);
    }

    private static string GetMimeType(ImageFormat imageFormat)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
        return codecs.First(codec => codec.FormatID == imageFormat.Guid).MimeType;
    }
}
public ActionResult Index()
    {
  return new ImageResult { Image = image, ImageFormat = ImageFormat.Jpeg };
    }
    <%=Html.Image<CapchaController>(c => c.Index(), 120, 30, "Current time")%>

10

আপনি সরাসরি প্রতিক্রিয়াতে লিখতে পারেন তবে তা পরীক্ষামূলক নয়। কার্যকর করা স্থগিত হওয়া অ্যাকশনারসাল্টকে ফেরত দেওয়া পছন্দসই। এখানে আমার পুনরায় পুনরায় চালুযোগ্য স্ট্রিমরসাল্ট:

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

9

কেন সরল হয়ে টিলড ~অপারেটর ব্যবহার করবেন না ?

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

6

আপডেট: আমার মূল উত্তরের চেয়ে আরও ভাল বিকল্প আছে। এটি এমভিসির বাইরে বেশ ভাল কাজ করে তবে চিত্রের সামগ্রী ফেরত দেওয়ার অন্তর্নির্মিত পদ্ধতিগুলির সাথে লেগে থাকা ভাল। আপ-ভোট দেওয়া উত্তরগুলি দেখুন।

আপনি অবশ্যই পারেন। এই পদক্ষেপগুলি ব্যবহার করে দেখুন:

  1. চিত্রটি ডিস্ক থেকে একটি বাইট অ্যারেতে লোড করুন
  2. আপনি চিত্রটির জন্য আরও অনুরোধের ক্ষেত্রে চিত্রটি ক্যাশে করুন এবং ডিস্ক I / O চান না (আমার নমুনা এটি নীচে ক্যাশে করে না)
  3. রেসপন্স.কন্টেন্টটাইপের মাধ্যমে মাইম প্রকারটি পরিবর্তন করুন
  4. প্রতিক্রিয়া.বাইনারিWite চিত্র বাইট অ্যারে লিখুন

এখানে কিছু নমুনা কোড রয়েছে:

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

আশা করি এইটি কাজ করবে!


4
এবং এটি কীভাবে নিয়ন্ত্রণকারীর ক্রিয়ায় দেখবে?
ক্রিস

5

সমাধান 1: একটি চিত্রের URL থেকে একটি দৃশ্যে একটি চিত্র রেন্ডার করতে

আপনি নিজের এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:

public static MvcHtmlString Image(this HtmlHelper helper,string imageUrl)
{
   string tag = "<img src='{0}'/>";
   tag = string.Format(tag,imageUrl);
   return MvcHtmlString.Create(tag);
}

তারপরে এটি ব্যবহার করুন:

@Html.Image(@Model.ImagePath);

সমাধান 2: ডাটাবেস থেকে চিত্র সরবরাহ করতে

নীচের মতো চিত্রের ডেটা ফেরত দেয় এমন একটি নিয়ন্ত্রণকারী পদ্ধতি তৈরি করুন

public sealed class ImageController : Controller
{
  public ActionResult View(string id)
  {
    var image = _images.LoadImage(id); //Pull image from the database.
    if (image == null) 
      return HttpNotFound();
    return File(image.Data, image.Mime);
  }
}

এবং এটিকে এমন দৃষ্টিতে ব্যবহার করুন:

@ { Html.RenderAction("View","Image",new {id=@Model.ImageId})}

যে কোনও এইচটিএমএলে এই ক্রিয়াকলাপ থেকে রেন্ডার করা একটি চিত্র ব্যবহার করতে, ব্যবহার করুন

<img src="http://something.com/image/view?id={imageid}>

5

এটি আমার পক্ষে কাজ করেছে। যেহেতু আমি একটি এসকিউএল সার্ভার ডাটাবেসে চিত্রগুলি সঞ্চয় করছি।

    [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)ডিবিতে চিত্র ফাইলের রেকর্ড অনুসন্ধান করা হচ্ছে (EF প্রসঙ্গ)। এটি একটি ফাইলআইমেজ অবজেক্ট ফেরত দেয় যা কেবলমাত্র আমি মডেলের জন্য তৈরি একটি কাস্টম ক্লাস এবং তারপরে এটি ফাইলকন্টেন্টআরসাল্ট হিসাবে ব্যবহার করি।

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

4

ভিউ, সামগ্রী ইত্যাদির মতো কোনও ফাইল ফেরত দেওয়ার জন্য আপনি ফাইল ব্যবহার করতে পারেন

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

            }

3

কন্টেন্টের ফলাফল দেখুন। এটি একটি স্ট্রিং দেয়, তবে এটি আপনার নিজের বাইনারিআরসাল্ট-জাতীয় শ্রেণি তৈরি করতে ব্যবহৃত হতে পারে।


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

SomeHelper.EmptyImageResult()FileResultবিদ্যমান চিত্রটি দিয়ে ফিরে আসা উচিত (উদাহরণস্বরূপ 1x1 স্বচ্ছ)।

আপনার যদি স্থানীয় ড্রাইভে ফাইল সঞ্চিত থাকে তবে এটি সবচেয়ে সহজ উপায়। যদি ফাইলগুলি হয় byte[]বা stream- তবে ডায়ালানের প্রস্তাবিত হিসাবে FileContentResultবা ব্যবহার করুন FileStreamResult


1

আমি দুটি বিকল্প দেখতে পাচ্ছি:

1) আপনার নিজের আইভিউইনজাইন প্রয়োগ করুন এবং আপনি আপনার পছন্দসই "চিত্র" পদ্ধতিতে আপনার চিত্রভিউজিনিতে যে নিয়ামকটি ব্যবহার করছেন তার ViewEngine বৈশিষ্ট্য সেট করুন।

2) একটি ভিউ ব্যবহার করুন :-)। শুধু বিষয়বস্তুর ধরণ ইত্যাদি পরিবর্তন করুন


1
অতিরিক্ত স্পেস বা ভিউতে সিআরএলএফ থাকার কারণে সমস্যা হতে পারে।
এলান হাসন

2
আমি আমার শেষ পোস্টে ভুল ছিল ... msdn.microsoft.com/en-us/library/... আপনি একটি দৃশ্য :) WebImage বর্গ WebImage.Write ব্যবহার করুন এবং
প্রাণবন্ততা Hasson

1

আপনি HTTPContext.Response ব্যবহার করতে পারেন এবং এটিতে সরাসরি লিখিত সামগ্রী লিখতে পারেন (WritFile () আপনার জন্য কাজ করতে পারে) এবং তারপরে অ্যাকশনআরসাল্টের পরিবর্তে আপনার ক্রিয়া থেকে ContentResult প্রত্যাবর্তন করতে পারে।

দাবি অস্বীকার: আমি এটি চেষ্টা করিনি, এটি উপলব্ধ APIs দেখার উপর ভিত্তি করে। :-)


1
হ্যাঁ আমি কেবল লক্ষ্য করেছি বিষয়বস্তু ফলাফল কেবল স্ট্রিংগুলিকে সমর্থন করে, তবে আপনার নিজের অ্যাকশনারসাল্ট ভিত্তিক শ্রেণি তৈরি করা যথেষ্ট সহজ।
লেপি

1

নীচে কোডটি System.Drawing.Bitmapচিত্রটি লোড করতে ব্যবহার করে।

using System.Drawing;
using System.Drawing.Imaging;

public IActionResult Get()
{
    string filename = "Image/test.jpg";
    var bitmap = new Bitmap(filename);

    var ms = new System.IO.MemoryStream();
    result.Save(ms, ImageFormat.Jpeg);
    ms.Position = 0;
    return new FileStreamResult(ms, "image/jpeg");
}

0

আমিও একইরকম প্রয়োজনের মুখোমুখি হয়েছি,

সুতরাং আমার ক্ষেত্রে আমি ইমেজ ফোল্ডার পাথ দিয়ে কন্ট্রোলারের কাছে একটি অনুরোধ করব, যা বিনিময়ে একটি চিত্রআরসাল্ট অবজেক্টকে প্রেরণ করে।

নিম্নলিখিত কোড স্নিপেট কাজ চিত্রিত:

var src = string.Format("/GenericGrid.mvc/DocumentPreviewImageLink?fullpath={0}&routingId={1}&siteCode={2}", fullFilePath, metaInfo.RoutingId, da.SiteCode);

                if (enlarged)
                    result = "<a class='thumbnail' href='#thumb'>" +
                        "<img src='" + src + "' height='66px' border='0' />" +
                        "<span><img src='" + src + "' /></span>" +
                        "</a>";
                else
                    result = "<span><img src='" + src + "' height='150px' border='0' /></span>";

এবং চিত্রের পথ থেকে নিয়ামকটিতে আমি চিত্রটি উত্পন্ন করি এবং এটি আবার কলারে ফিরিয়ে দেব

try
{
  var file = new FileInfo(fullpath);
  if (!file.Exists)
     return string.Empty;


  var image = new WebImage(fullpath);
  return new ImageResult(new MemoryStream(image.GetBytes()), "image/jpg");


}
catch(Exception ex)
{
  return "File Error : "+ex.ToString();
}

0

চিত্রটি পড়ুন, এটিকে রূপান্তর করুন byte[], তারপরে File()একটি সামগ্রীর ধরণের সাথে একটি ফিরিয়ে দিন ।

public ActionResult ImageResult(Image image, ImageFormat format, string contentType) {
  using (var stream = new MemoryStream())
    {
      image.Save(stream, format);
      return File(stream.ToArray(), contentType);
    }
  }
}

এখানে ব্যবহারসমূহ:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Microsoft.AspNetCore.Mvc;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.