webForumDet fria alternativet

ladda upp och skala om bilder asp.net

.NET

1 svar · 1 238 visningar · startad av Sanji

Medlem sedan juli 2009355 inlägg
Frågan#1

hej! I min asp.net applikation har jag en funktion för att ladda upp en bild(logga som används på en utskrift) som ser ut så här:

if (imgUpload.PostedFile.ContentLength > 0)
            {
                if (imgUpload.PostedFile.FileName.Substring(imgUpload.PostedFile.FileName.LastIndexOf(".")) == ".jpg")
                {
                    
                    string filePath = Server.MapPath("~/Logos/") + currentUser.CompanyID.ToString() + ".jpg";
                   
                    if (File.Exists(filePath+1))
                    {
                        File.Delete(filePath+1);
                    }

                    imgUpload.SaveAs(filePath+1);

img = System.Drawing.Image.FromFile(filePath+1); //System.Drawing.Bitmap.FromFile(filePath);

                  
                    Size size = new Size(img.Width, img.Height);
                    if (img.Width > 600)
                    {

                        img = resizeImage(img, size);

                        this.saveJpeg(filePath, new Bitmap(this.img), 85L);

                    }
                    else
                    {
                        if (File.Exists(filePath))
                        {
                            File.Delete(filePath);
                        }
                        File.Copy(filePath+1, filePath);
                    }
                    
                
                }
                else
                {
                    Response.Redirect("Companies.aspx?ErrorFileExt=1");
                    return;
                }
            }            
            Response.Redirect("Companies.aspx");

funktionen för resize

private static System.Drawing.Image resizeImage(System.Drawing.Image imgToRezise, Size size)
        {

            int sourceWidth = imgToRezise.Width;
            int sourceHeight = imgToRezise.Height;

            float originalwidth = imgToRezise.Width;
            float nPercentW = 600;
            

          
                nPercentW = nPercentW / originalwidth;

                int destWidth = (int) (sourceWidth * nPercentW);
                int destHeight = (int) (sourceHeight * nPercentW);

                Bitmap b = new Bitmap(destWidth, destHeight);
                Graphics g = Graphics.FromImage((System.Drawing.Image)b);
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                g.DrawImage(imgToRezise, 0, 0, destWidth, destHeight);
                g.Dispose();
            
            return (System.Drawing.Image)b;
        }

Funktion för att spara som jpg och codec-inställningar

private void saveJpeg(string path, Bitmap img, long quality)
        {
            // Encoder parameter for image quality
            EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
            // Jpeg image codec
            ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg");
            if (jpegCodec == null)
            {
                return;
            }
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = qualityParam;

            

            

            img.Save(path, jpegCodec, encoderParams);
            

        

        }
        private ImageCodecInfo getEncoderInfo(string mimeType)
        {
            // Get image codecs for all image formats
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

            // Find the correct image codec
            for (int i = 0; i < codecs.Length; i++)
                if (codecs[i].MimeType == mimeType)
                    return codecs[i];
            return null;
        }

problemet jag har är att när jag laddat upp en bild och sedan försöker ladda upp en ny, så klagar den på första delete-koden:

if (File.Exists(filePath+1))
                    {
                        File.Delete(filePath+1);
                    }

Felmeddelandet säger att filen används av en annan process, så det går då inte att ta bort den. hur ska jag göra för att förhindra detta?

är det "img" som håller bilden öppen även efter att den har sparats?

Glömde att säga att filnamnet är användarens ID + .jpg, vilket betyder att de sparas om med samma namn.

Mvh Marcus

Medlem sedan juli 2009355 inlägg
#2

löste det med:

FileStream fs = new FileStream(filePath+1, FileMode.Open, FileAccess.ReadWrite);
img = System.Drawing.Image.FromStream(fs);

Mvh Marcus

261 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)