Avatar billede innercitydk Nybegynder
13. november 2005 - 14:21 Der er 19 kommentarer og
1 løsning

Kan ikke slette billeder på server

Jeg har lavet en galleri side hvor man kan uploade og se forskellige billeder. Mit problem er at hvis en besøgende har fået vist et billede kan det ikke slettes før efter ca 15 minutter tror jeg. Jeg bruger et script til at genenere thumbs ud fra hvilke billeder der ligger i mappen, så stierne bliver altså ikke gemt i en db.

Nogen idéer?

//Nicki
Avatar billede snepnet Nybegynder
13. november 2005 - 14:27 #1
Måske du undlader at lave en dispose på billederne?
mvh
Avatar billede innercitydk Nybegynder
13. november 2005 - 14:38 #2
scriptet laver et array med billed stierne og adder dem hvorefter de disposes

void Page_Load(Object sender, EventArgs e)
{
    const int maxWidth  = 100;
    const int maxHeight = 100;
   
    ArrayList pics = new ArrayList();
    string html;
    int imgHeight;
    int imgWidth;
   
foreach(string s in Directory.GetFiles(Server.MapPath("galleri/"), "*.jpg"))
{   
  System.Drawing.Image currentImage = System.Drawing.Image.FromFile(s);
     
  imgHeight = currentImage.Height;
  imgWidth = currentImage.Width;
  if ((imgWidth > maxWidth) || (imgHeight > maxHeight))
  {
    int deltaWidth  = imgWidth - maxWidth;
    int deltaHeight = imgHeight - maxHeight;
    double scaleFactor;
       
    if (deltaHeight > deltaWidth)
    {
      scaleFactor = Convert.ToDouble(maxHeight) / imgHeight;
    }
    else
    {
      scaleFactor = Convert.ToDouble(maxWidth) / imgWidth;
    }
   
    imgWidth  = Convert.ToInt32(imgWidth * scaleFactor);
    imgHeight = Convert.ToInt32(imgHeight* scaleFactor);         
  }
 
  if ((imgHeight != currentImage.Height) || (imgWidth != currentImage.Width))
  {
    html = "<a href=\"viewimage.aspx?img=galleri/" + Path.GetFileName(s) + "\">" + "<img border=\"1\" style=\"border:1px darkred\" src=\"getthumb.aspx?img=galleri/" + Path.GetFileName(s) + "&w=" + imgWidth.ToString() + "&h=" + imgHeight.ToString() + "\" " + "height=\"" + imgHeight + "\" width=\"" + imgWidth + "\">" + "</a><br>"+Path.GetFileName(s).ToString();
  }
  else
  {   
    html = "<a href=\"viewimage.aspx?img=galleri/" + Path.GetFileName(s) + "\">" + "<img border=\"1\" src=\"getthumb.aspx?img=galleri/" + Path.GetFileName(s) + "\" " + "height=\"" + imgHeight.ToString() + "\" width=\"" + imgWidth.ToString() + "\">" + "</a><br>"+Path.GetFileName(s).ToString();
  }
    pics.Add(html);
    currentImage.Dispose();
  }
  dlPictures.DataSource = pics;
  dlPictures.DataBind();
}
</script>
Avatar billede snepnet Nybegynder
13. november 2005 - 14:49 #3
Jeg mener FromFile(...) holder filen åben.
Prøv at hent billedet via en filestream, og opret billedet med Image.FromStream(...) istedet.
mvh
Avatar billede snepnet Nybegynder
13. november 2005 - 14:53 #4
altså noget i denne stil:

FileStream fs = new FileStream(somePath, FileMode.Open);
Image image = Image.FromStream(fs);
fs.Close();

mvh
Avatar billede innercitydk Nybegynder
13. november 2005 - 14:56 #5
jeg er ret ny til .net så jeg kan ik lige gennemskue hvordan :) Kan du eventuelt komme med et eksempel, eller måske rette scriptet så det virker på den måde du har beskrevet..
Avatar billede snepnet Nybegynder
13. november 2005 - 14:59 #6
prøv at skift denne linie :

System.Drawing.Image currentImage = System.Drawing.Image.FromFile(s);

ud med

System.IO.FileStream fs = new System.IO.FileStream(s, FileMode.Open);
System.Drawing.Image image = System.Drawing.Image.FromStream(fs);
fs.Close();

mvh
Avatar billede snepnet Nybegynder
13. november 2005 - 14:59 #7
ups - du må hellere kalde billedet det samme som før :o)
System.IO.FileStream fs = new System.IO.FileStream(s, FileMode.Open);
System.Drawing.Image currentImage = System.Drawing.Image.FromStream(fs);
fs.Close();
Avatar billede innercitydk Nybegynder
13. november 2005 - 15:00 #8
skal den ik stadig hedde currentImage
Avatar billede innercitydk Nybegynder
13. november 2005 - 15:01 #9
hehe vores posts overlapper lidt :) jeg tjekker det lige
Avatar billede snepnet Nybegynder
13. november 2005 - 15:01 #10
:o)
Avatar billede innercitydk Nybegynder
13. november 2005 - 15:15 #11
jeg får en fejl

Exception Details: System.UnauthorizedAccessException: Access to the path "C:\Inetpub\wwwroot\kikhavn\galleri\butik2.jpg" is denied.
Avatar billede snepnet Nybegynder
13. november 2005 - 16:18 #12
sorry ... der kom lige et spisebord ind ad døren ?!?

prøv eksplicit at give asp.net brugeren adgang til at læse i den folder du har billederne liggende i.
og... så skal du nok flytte fs.Close() ned til der hvor du er færdig med at arbejde med billedet.

mvh
Avatar billede innercitydk Nybegynder
13. november 2005 - 19:17 #13
Fandt lige ud af at det kører online altså genereringen. også med filestream. Men jeg kan stadig ikke slette billederne. kan jeg gøre sådan at aspx siden det ligger på ikke bliver gemt i cache?
Avatar billede snepnet Nybegynder
13. november 2005 - 20:38 #14
øh ja  ... det kan du sådan set godt, men umiddelbart kan jeg ikke se hvilken forskel det skulle gøre?

du må lige finde ud af hvor problemet ligger, og hvornår du ikke kan slette filen.

prøv at se det er:

string path = <somePath>;
Image im = Image.FromFile(s);
// her kan jeg ikke slette billedet
im.Dispose();
// her kan jeg godt slette billedet


eller ...

FileStream fs = new FileStream(s, FileMode.Open);
Image currentImage = Image.FromStream(fs);
// her kan jeg ikke slette billedet
fs.Close();
// her kan jeg godt slette billedet

Du må prøve at debugge, og så stoppe din eksekvering udvalgte steder, så du kan se hvornår filen er låst, og hvornår den ikke er.

mvh
Avatar billede innercitydk Nybegynder
14. november 2005 - 14:47 #15
Jeg prøver ikke at slette programmet fra hjemmesiden da jeg ikke har kunne løse det her problem. Det er når jeg sletter via ftp, eller igennem dreamweaver jeg ikke kan slette dem.

jeg tror måske problemet opstår fordi de små thumb billeder bliver genereret på en getthumb underside. Billederne hives ind i oversigten således:

src=\"getthumb.aspx?img=galleri/"

getthumb.aspx har følgende kode:

<!--ASP.NET Simple PhotoGallery -->
<!--http://www.thezeal.com/software -->

<%@Import Namespace="System.Drawing.Imaging" %>
<%@Import Namespace="System.Drawing" %>
<script language="c#" runat="server">

public void Page_Load(Object sender, EventArgs e)
{

    // Read in the image filename to create a thumbnail of
    string imageUrl = Request.QueryString["img"];
   
    // Read in the width and height
    int imageHeight = Convert.ToInt32(Request.QueryString["h"]);
    int imageWidth  = Convert.ToInt32(Request.QueryString["w"]);

    //Make sure that the image URL doesn't contain any /'s or \'s
    //If imageUrl.IndexOf("/") >= 0 Or imageUrl.IndexOf("\") >= 0 then
    // We found a / or \
    //  Response.End()
    // End If
   
    //Add on the appropriate directory
    //imageUrl = imageUrl
   
    System.Drawing.Image fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl));

    //Do we need to create a thumbnail?
    Response.ContentType = "image/jpeg";
    if ((imageHeight > 0) && (imageWidth > 0))
    {
      Bitmap bitmap1 = new Bitmap(imageWidth, imageHeight, fullSizeImg.PixelFormat);

      Graphics new_g  = Graphics.FromImage(bitmap1);
      new_g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
      new_g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
      new_g.DrawImage(fullSizeImg, 0, 0, bitmap1.Width, bitmap1.Height);

      bitmap1.Save(Response.OutputStream, ImageFormat.Jpeg);

      new_g.Dispose();
      bitmap1.Dispose();
               
    }
    else
    {
      fullSizeImg.Save(Response.OutputStream, ImageFormat.Jpeg); 
    }
    //fullSizeImg.Dispose()
}
</script>

Jeg har kommenteret fullSizeImg.Dispose() ud for ellers er der bare røde krydser på galleri siden istedet for thumbs.
Avatar billede innercitydk Nybegynder
14. november 2005 - 14:47 #16
slette programmet skulle være slette billedet :)
Avatar billede snepnet Nybegynder
14. november 2005 - 15:29 #17
:o)

Nå - men det er jo nok der dit problem ligger istedet.... Prøv sådan noget her istedet:

FileStream fs = new FileStream(Server.MapPath(imageUrl), FileMode.Open);
Image fullSizeImg = Image.FromStream(fs);
fs.Close();

Bitmap bitmap1 = new Bitmap(imageWidth, imageHeight, fullSizeImg.PixelFormat);
Graphics new_g = Graphics.FromImage(bitmap1);
new_g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
new_g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
new_g.DrawImage(fullSizeImg, 0, 0, bitmap1.Width, bitmap1.Height);

bitmap1.Save(Response.OutputStream, ImageFormat.Jpeg);
bitmap1.Dispose();

(du kan eventuelt nøjes med ovenstående indtil videre og så droppe det scenarie hvor den ikke genererer en thumbnail.... så er det lidt mere entydigt hvad der sker).

mvh
Avatar billede innercitydk Nybegynder
15. november 2005 - 08:31 #18
Det virker stadig ikke.. Jeg gider ik rode mere med det :) Smid lige et svar. Du har brugt en del tid på det her og det skal du have point for.
Avatar billede innercitydk Nybegynder
04. december 2005 - 18:53 #19
?!
Avatar billede snepnet Nybegynder
05. december 2005 - 23:27 #20
hov sorry!
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester