Можем ли мы использовать Server.MapPath в Bitmap? - PullRequest
0 голосов
/ 03 октября 2011

недавно я создал веб-страницу, где у меня есть тег img, источник которого связан с другой страницей, где я изменяю размер изображения, чье имя отправляется с src с предыдущей страницы в строке запроса. но когда я создаю новый объект растрового изображения, я получаю сообщение об ошибке, параметр недействителен.

ниже код, который содержит тег изображения.

 <img src='/resize.aspx?file=PRO_06_11_Final-272.jpg&width=128&height=73' alt="Nothing" />

ниже приведен код страницы изменения размера, где я изменяю размер изображения и отправляю растровый объект через ответ

if (Request.QueryString["file"] != null)
        {

            int lnHeight = Convert.ToInt32(Request.QueryString["height"]);
            int lnWidth = Convert.ToInt32(Request.QueryString["width"]);
            string imgUrl = Request.QueryString["file"].ToString();
            Bitmap bmpOut = null;
            try
            {
                Bitmap loBMP;
                loBMP = new Bitmap(Server.MapPath(imgUrl)); //Parameter is not valid.. error is thrown here.
                System.Drawing.Imaging.ImageFormat loFormat = loBMP.RawFormat;
                decimal lnRatio;
                int lnNewWidth = 0;
                int lnNewHeight = 0;
                //-----If the image is smaller than a thumbnail just return it As it is----- 
                if ((loBMP.Width < lnWidth && loBMP.Height < lnHeight))
                {
                    lnNewWidth = loBMP.Width;
                    lnNewHeight = loBMP.Height;
                }
                if ((loBMP.Width > loBMP.Height))
                {
                    lnRatio = (decimal)lnHeight / loBMP.Height;
                    lnNewHeight = lnHeight;
                    decimal lnTemp = loBMP.Width * lnRatio;
                    lnNewWidth = (int)lnTemp;
                    if (lnNewWidth > 128)
                    {
                        lnNewWidth = 128;
                    }
                 }
                else
                {
                    lnRatio = (decimal)lnHeight / loBMP.Height;
                    lnNewHeight = lnHeight;
                    decimal lnTemp = loBMP.Width * lnRatio;
                    lnNewWidth = (int)lnTemp;
                    if (lnNewWidth < 75)
                    {
                        lnNewWidth = 75;
                    }
                }
                bmpOut = new Bitmap(lnNewWidth, lnNewHeight);
                Graphics g = Graphics.FromImage(bmpOut);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight);
                Response.ContentType = "image/jpeg";
                bmpOut.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (Exception ex)
            {
                HttpContext.Current.Response.Write("CreateThumbnail :" + ex.ToString());
            }
            finally
            {
            }
        }

приведенный выше код прекрасно работает на локальном компьютере в FileSystem, но когда я помещаю тот же код на сервер dev, приложение начинает выдавать сообщение ..

Может кто-нибудь сказать мне, что может быть причиной этой проблемы только на сервере Dev.

1 Ответ

1 голос
/ 03 октября 2011

Если вы не укажете корневую папку для Server.MapPath, будет добавлено местоположение исполняемого в данный момент aspx-файла.Вы можете прочитать больше на msdn

If Path doesn't start with a slash, the MapPath method returns a path relative to the directory of the .asp file being processed

Как упоминал Ганлет, вам нужно добавить корневую папку изображений.Таким образом, ваш код станет

string imgRoot = "~/images/";
try
{
    ...

    loBMP = new Bitmap(Server.MapPath(imgRoot + imgUrl));
    ...
}
...