Tja! 1. Nej, inte på det sättet som du har tänkt. Du kan inte skicka bilderna i samma response som sidan, bilderna hämtas i en separat request av webbläsaren. Okay, jag e inte så insatt i https begränsningar. Det enda acceptabla är att antingen hämta ifrån databas, eller att lägga i cachen (som delas av alla som besöker sidan.) För att lägga hela bilder i session kommer käka upp serverns minne på nolltid Jepp cachen låter som bästa alternativet. Om man då ändrar så att man kan bara ha sitt album publikt eller private så kan man lagra informationen på följande vis. Ersätt dessutom din sida (photo.aspx) mde en HttpHandler (photo.ashx) vlket är betydligt mer effektivt då du ändå inte är intresserad av den funktionalitet som Page tilhandahåller (och som skulle kunna bli ett prestandaproblem) : ViewState, events, osv. Tackar för det =) Du kommer åt Context på exakt samma sätt som i en sida.Ide på att säkra foto på fotosite
Inledning
Först var det meningen att min foto site endast skulle innehålla publika foto(foto som alla kan ta del av) men efter att ha tittat lite på streaming så kanske det finns en enkel utväg?
Idag
Alla foto ligger i en katalog som heter photoStore, här lunder hittar man vidare användares kataloger ex
photoStore\users\kalle
photoStore\users\Lisa
Här under ligger vidare en Larg Medium och small katalog för de olika formaten på fotona:
photoStore\users\Lisa\Larg
photoStore\users\Lisa\Medium
photoStore\users\Lisa\Small
I dagens läge är photoStore strukturen helt öppen för att blädra igenom.
Ide
Efter ha tittat lite på steraming i ASP.NET 2.0 så funderar jag på om det igentligen inte är väldigt lätt att implementera en koll på varje album(eller bild)?
Säg att vi låser katalogen photoStore och deras subkataloger från att bli accessade utifrån.
På siten har vi en repeater, idag lägger den ut <img> taggar och sätter sökvägen till bilden i codebehind(itemdatabound)
Vi skulle då kunna ersätta <img> taggen med en usercontrol istället och då ha något i stil med följande kod i den(men i C# =D):
Kod:
' Output an image as a binary stream to the Response object
Sub ShowImage(ByVal bmp As Bitmap)
' Clear current content and set returned content type
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.ContentType = "image/jpeg"
' Save to the Response.OutputStream object
bmp.Save(HttpContext.Current.Response.OutputStream, _
Imaging.ImageFormat.Jpeg)
bmp.Dispose()
HttpContext.Current.Response.End()
End Sub
(http://www.devx.com/vb2themax/Tip/19463)
Denna koden borde rendera bilden i usercontrollen om jag inte missförstår det hela?
Om detta fungerar så skulle jag då kunna kontrollera behörigheten på albums nivå innan vi går till databasen för att hämnta ut bilderna och koppla dem tilll repeaterns datasource.
Frågor
1. Är detta möjligt?
2. Kan man kanske undvika att använda den extra usercontrollen och istället placera ut det direkt i siten på en viss position? och isåfall hur?
3. innebär detta några prestanda förändringar jämfört med så som siten fungerar idag?Sv: Ide på att säkra foto på fotosite
Sv:Ide på att säkra foto på fotosite
Det man skulle kunna göra är något i stil med detta:
<img src="photo.aspx?photoId=551" height="100" width="100"/>
Problemet är att dett kommer tvinga photo.aspx att behöva hämnta information från databasen som igentligen redan är hämntad en gång, dessutom krävs det en connection till MySQL databas för varje bild vilket inte är acceptabelt.
Kanske skulle man kunna lägga informationen i en session och sen hämnta ut den i photo.aspx men problemet är väll att photo.aspx kommer köras efter repeatern är färdig så då kan man inte lagra info om en bild i en session utan man måste lagra det i flera(om man inte lagrar någon form av generic list?
Det som behövs till photo.aspx är en sökväg till bilden det är igentligen allt. Finns det någon smart lösning för detta?Sv: Ide på att säkra foto på fotosite
Sv:Ide på att säkra foto på fotosite
PhotoId, permission
Då gör man detta för vaje bild, och alla kan komma åt det.
Cachen sätts på 10-20, finns inte albumets bilder i cachen så läses dem in.Sv: Ide på att säkra foto på fotosite
Nedan är exempelkod (från .NET 1.1 men är lättkonverterad) på hur man skulle kunna göra en HttpHandler som streamar ut en bild (jpg). i parametern filename kommer id på bilden och vi antar att bilden heter Image<id>.jpg. Var bilderna ligger är angivet i web.config.
Felhantering och loggning har tagits bort för att korta ner koden.
public class PlainImage : IHttpHandler
{
public PlainImage()
{
}
// Override the IsReusable property
public bool IsReusable
{
get { return true; }
}
// Override the ProcessRequest method
public void ProcessRequest(HttpContext context)
{
// Get prameters.
string filenameId = context.Request["filename"];
string filename = String.Format("Image{0}.jpg", filenameId);
try
{
string datastorePath = ConfigurationManager.AppSettings["datastore.path"];
string fullfilePath = Path.Combine(datastorePath, filename);
// Generate image.
Bitmap image = new Bitmap(filename);
// Write image to output.
HttpContext.Current.Response.ContentType = "image/jpeg";
image.Save(HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
// Release image.
image.Dispose();
}
catch(Exception exc)
{
// Felhantering...
}
}
}
Dvs plainimage.ashx?filename=234 kommer att streama ut bilden Image234.jpg.
I din andra sida så har du alltså <img src=plainimage.ashx?filename=234>.
/Andreas
Sv:Ide på att säkra foto på fotosite
Så anledningen till att använda HttpHandler är i stort föratt höja prestandan genom att ta bort funktionalitet som ändå inte används.
Men hur är det med cachning? kommer man åndå att komma åt den i en HttpHandler?Sv: Ide på att säkra foto på fotosite
Mao : som en sida men utan funktionalitet som är specifik för klassen Page.
/Andreas