webForumDet fria alternativet

visa bilder som finns sparade i databasen

.NET

17 svar · 556 visningar · startad av Naaz

Medlem sedan maj 200333 inlägg
Frågan#1

Hej!
Jag har tittat på andra inlägg med samma problem men jag har inte blivit klokare.

Jag har en Datagrid som har en kolumn där man ska visa bilder som har sparats i databasen (alltså själva bilddata har sparats, inte urlen till bilden).

Hur gör jag om jag vill för varje ItemTemplate i Datagriden (som består av en asp:image) visa lämplig bild? Jag vill inte spara bilden lokalt för att sen visa upp det.

Mvh,
Naz

Medlem sedan apr. 20012 266 inlägg
#2

Du bör göra antigen en HTTPHandler eller en aspx sida som har hand om att hämta bilden från databasen, då blir det så att i din asp:image så anger du adressen till din aspx sida eller httphandler som hämtar bilden, <asp:image ImageUrl="visabild.aspx?=68"/>

Medlem sedan maj 200333 inlägg
#3

Tack så jättemycket! :-) Jag valde lösningen med asp:image ImageUrl="visabild.aspx?=68"/> och det funkar jättefint!

En annan fråga:
Hur gör jag om jag vill ändra bildstorleken dynamiskt? När jag har hämtat bilden och presenterat den i <asp:image id=img> vill jag minska bilden enligt följande.

if (imageHeight > imageWidth) {
if (imageHeight > 90) imageHeight = 90;
if (imageWidth > 60) imageWidth = 60;
}
else {
if (imageWidth > 125) imageWidth = 125;
if (imageHeight > 90) imageHeight = 90;
}

img.Height = imageHeight;
img.Width = imageWidth;

Jag vill inte spara den hämtade bilden i filsystem och på så sätt ta reda på storleken.

Mvh,
Naz

Medlem sedan apr. 20012 266 inlägg
#4

Ändra storlek på den i visabild.aspx.
http://aspnet.4guysfromrolla.com/articles/012203-1.aspx

Medlem sedan maj 200333 inlägg
#5

Jag blev inte ett dugg klokare. Den antar att man sparar ner filen. Men det gör inte mitt program. Mitt program hämtar bilden (byte[]) från databasen och representerar den i <asp:image> utan att spara den nånstans.

Jag förstår fortfarande inte:

  1. Hur jag får reda på storleken på bilden i databasen
  2. Hur jag talar om för <asp:image att width=125 och height=90 (tex).

Jag vill inte mellanlagra filen nånstans efter att jag har hämtat den från databasen. Går det att på nåt sätt utnyttja bilddata (byte[]) och skapa en Image eller nåt?

/Förvirrad

Medlem sedan dec. 19991 072 inlägg
#6

Hur ser din befintlig kod i "visabild.aspx" ut nu?

För att ändra storleken antar jag att du får läsa in bilden till ett Image-objekt och sen ändra storleken på det innan du skickar ut det till klienten igen...

...men visa din kod först...

Medlem sedan maj 200333 inlägg
#7

På första sidan (där bilden ska visas) har jag följande:

<asp:image id="imgNews" runat="server" ImageUrl="visabild.aspx?ID=42"></asp:image>

I visabild.aspx har jag följande kod:

int id = Convert.ToInt32(this.Request.QueryString["ID"]);
DataSet ds = getImage(id)
ds.EnforceConstraints = false;

if (ds.Tables[0] != null && ds.Tables[0].Rows.Count > 0) {
DataRow dataRow = ds.Tables[0].Rows[0];
string fileType = ((string)dataRow.ItemArray.GetValue(2)).ToLower();
byte[] fileData = (byte[]) dataRow.ItemArray.GetValue(5);

Response.ContentType = "image/" + fileType;
Response.BinaryWrite(fileData);
}

Jag ser bilden på sidan, men kan inte göra lämplig resize på bilden.

/Naz

Medlem sedan apr. 20012 266 inlägg
#8

Ungefär så här:

MemoryStream stream = new MemoryStream(image); // image är en byte[]

Image img = Image.FromStream(stream);
Image newimg = img.GetThumbnailImage(width, height, null, System.IntPtr.Zero);

newimg.Save(Response.OutputStream, ImageFormat.Gif)
Medlem sedan maj 200333 inlägg
#9

Tack :-) Nu funkar det!

Medlem sedan maj 200333 inlägg
#10

Ännu en fråga:

Varför blir kvaliteten så mycket sämre när man använder ovanstående variant?

/Naz

Medlem sedan apr. 20012 266 inlägg
#11

Kan bero på att GIF konverteringen är inställd på låg kvalité, testa med png eller annat format och se om det blir bättre.

Medlem sedan maj 200333 inlägg
#12

Nu är det en ny fråga på G.
Tidigare så gällde min fråga att visa bilder som var sparade i databasen. Nu gäller frågan övrig dokument (word, html, pdf mm).

Dessa filer finns också sparade i databasen. När min aspx sida laddas upp visar jag en lista med länkar med namnen på alla filer som finns sparade i databasen. När användaren klickar på en av länkarna vill jag visa filen (word, IE, acrobat reader eller annat lämpligt). Hur gör jag? Jag får en byte[] från databasen. Ska jag använda memorystream här också? Hur gör jag då för att visa filen?

Mvh,
Naz

Medlem sedan apr. 20012 266 inlägg
#13

Response.BinaryWrite(dinbyte[]);

Sedan måste du även ändra Response.ContentType till ett lämpligt värde för varje dokument.

Medlem sedan maj 200333 inlägg
#14

Tack! :-) Jag hade skrivit fel på några "contenttype". Men mitt program funkar inte för pdf. Jag vet att filen inte är korrupt eller nåt (jag har testat det med ett annat program).

För pdf-filer skriver jag följande:

System.Web.HttpContext.Current.Response.ContentType = "Application/pdf";

men det funkar inte.

Mvh,
Naz

Medlem sedan apr. 20012 266 inlägg
#15

Jag hade problem med .pdf filer förut, alla filtyper förutom .pdf fungerade. Har dock inte lösningen här, kommer inte heller ihåg den. Ska se om jag kan få tag i den imorn.

Medlem sedan maj 200333 inlägg
#16

Hej Renholm. Lyckades du få tag i lösningen?
Mvh,
Naz

Medlem sedan apr. 20012 266 inlägg
#17

Nix, imorn finns möjlighet att komma åt den så hör av mig då om jag fått tag i den.

Medlem sedan apr. 20012 266 inlägg
#18

Den fanns tyvärr inte tillgänglig nu, men om du visar koden för hur du lägger in i databasen samt för hur du hämtar så kanske jag kan minnas problemet.

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