简体   繁体   中英

Convert image file to base64 with rendering in a view

I have image captcha and in all browsers except chrome, captcha always reloading the same picture.How can i pix that.Mb i need to convert my image to base64string, i tried set nocache attribute to my controller/actions but it doesn't work.

public ActionResult CaptchaImageComm(string prefix, bool noisy = false)
    {
        var rand = new Random((int)DateTime.Now.Ticks);
        //generate new question
        int a = rand.Next(10, 99);
        int b = rand.Next(0, 9);
        var captcha = string.Format("{0} + {1} = ?", a, b);

        //store answer
        Session["Captcha5"] = a + b;

        //image stream
        FileContentResult img = null;
        string result = null;
        using (var mem = new MemoryStream())
        using (var bmp = new Bitmap(130, 30))
        using (var gfx = Graphics.FromImage((System.Drawing.Image)bmp))
        {
            gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
            gfx.SmoothingMode = SmoothingMode.AntiAlias;
            gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));

            //add noise
            if (noisy)
            {
                int i, r, x, y;
                var pen = new Pen(Color.Yellow);
                for (i = 1; i < 10; i++)
                {
                    pen.Color = Color.FromArgb(
                    (rand.Next(0, 255)),
                    (rand.Next(0, 255)),
                    (rand.Next(0, 255)));

                    r = rand.Next(0, (130 / 3));
                    x = rand.Next(0, 130);
                    y = rand.Next(0, 30);

                    gfx.DrawEllipse(pen, x - r, y - r, r, r);
                }
            }

            //add question
            gfx.DrawString(captcha, new Font("Tahoma", 15), Brushes.Gray, 2, 3);

            //render as Jpeg
            bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);

            img = this.File(mem.GetBuffer(), "image/Jpeg");

        }
        return img;
    }

and my action :

<img alt="Captcha" src="@Url.Action("CaptchaImageComm", "DataCaptcha")" style="" />

I set the cache settings as follows:

filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1))‌​;
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.A‌​llCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCach‌​e);
filterContext.HttpContext.Response.Cache.SetNoStore();

Perhaps another aproach could be to include a timestamp parameter with the current datetime to avoid caching. This technique is used sometimes to prevent caching webpages in browser, and perhaps can be used here. Just an idea.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM