27. juli 2004 - 22:43Der er
115 kommentarer og 1 løsning
Billede galleri med beskyttet adgang
Jeg søger en tutorial eller en guide i hvordan man laver sit eget billede galleri, hvor man kan tildele brugernavne og password til dem, som skal se det. På en _sikker_ måde.
Helst i Vb.Net (mellemadvancet)... Hvis det er C#, må det være i den helt lette ende.
Er det fordi du gerne vil prøve at lave det selv, eller skal du bare have noget der fungerer - og som er gratis ?
Hvis du gerne vil have tips... hvordan havde du så forestillet dig at galleriet skulle fungere ?
Skal man f.eks. bare initialisere med en path, og så genereres der thumbnails der smides ud til klienten med links til de "rigtige" billeder, eller hvor meget havde du forestillet dig skulle fikses af en eventuel komponent ?
Mht. til det med brugeradgangen. Skal det så være mere avanceret end at der bare skal gives adgang til en bruger til applikationen generelt, eller skal det være f.eks. imagefolder/type/?
Man kan ret hurtigt finde en hel del færdige gallerier, der koster helt ned til 5 dollar, og der er sikkert også nogle der er gratis rundt omkring.
Det er mest fordi jeg vil prøve at lave noget selv, men tror det er lidt for tidligt for mig.. Så jeg søger mest et færdiglavet et jeg kan pille af hinanden og få til at passe til mig...
Det jeg havde tænkt mig var: Jeg indtaster user,password Req. sendes til database Database returner nogle billeder-id'er Billeder-id'er gemmes i Session Redirect til ny side
Ny side: Henter billeder-id'er fra session Benyttes i en asp:repeater som bruger billeder-id'erne på formen, <img href="billede.aspx?id=117" />
Og hvis ville det være fedt hvis man kunne få billede.aspx til at sørge at den kun kan tilgåes fra "ny side"...
hov - du kan jo lige kigge på det link du fik. ellers kan jeg godt lave et skelet til dig, men det bliver ikke før imorgen desværre. Jeg er på vej i æsken.
huuh... jeg er ikke ret gode venner med VB er jeg bange for, men de par linier det drejer sig om skulle du nok kunne oversætte. Ellers tror jeg faktisk jeg har en oversætter liggende hvis det skulle være.
Jeg har oz fundet en oversætter på nettet.. Men den laver heller ikke ret meget andet end at erstatte ting 'End' med '}'.. Og ja, jeg oversætter bare selv.. Så sidder vi et skelet sådan en af dagene, det haster, man har vel ferie.. :) Sov godt
Hold da k*ft hvor var jeg træt igår... Skrev kl 23.21:30 : Så sidder vi et skelet sådan en af dagene, det haster, man har vel ferie.. :) Skulle have været : Så siger vi et skelet sådan en af dagene, det haster ikke, man har vel ferie endnu.. :)
using System; using System.Web.Security; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
namespace basementjack { /// <summary> /// Summary description for LogIn. /// </summary> public class LogIn : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox txtUserName; protected System.Web.UI.WebControls.TextBox txtPass; protected System.Web.UI.WebControls.Button btnLogIn; protected System.Web.UI.WebControls.Label lblMessage;
Du skal oprette dig en ekstra side også... princippet er så at hvis du prøver at gå ind på den, vil du blive bedt om at logge ind via login.aspx. Når du så indskriver rigtige oplysninger - bliver du redirected til den side du oprindelig bedte om.
Jeg sad længe og kiggede på koden.. Og da jeg kørte det første brokkede den sig også over jeg kiggede på... Could not load type 'basementjack.LogIn'. Det er denne linie: <%@ Page language="c#" Codebehind="LogIn.aspx.cs" AutoEventWireup="false" Inherits="basementjack.LogIn" %>
Det er et namespace-problem. Det er fordi mit projekt her hedder basementjack (og øverste namespace kommer til at hedde det samme som standard), men du har sikkert kaldt dit noget andet :o) Bare skift det ud med det du har kaldt det.
Nå for hede hule .... det er noget skidt - så er der jo nok nogle småting der bliver lidt mere besværlige :o) Det er ikke så meget jeg har arbejdet i webmatrix. Det er nok det nemmeste hvis du bare laver en almindelig side i webmatrix, og så paster det væsentlige ind.
Det er jo kun konfigurationsfilen og de her par linier der er interesante indtil videre :
Vil teste på mit webhotel.. Men web.config vil ikke siger at jeg ikke må se hvilken fejl det.. Men gætter på det er samme fejl.. Forstår ikke hvorfor den ikke vil "load type" basementjack.LogIn...
Du må bare bygge dit projekt op i webmatrix... Det med at den prøver at loade noget er fordi det er angivet i dit pagedirective, der som standard ser sådan her ud når du laver en side i webmatrix: <%@ Page Language="C#" %>
Metoder kan du bare kopiere ind i din kode, og hvis du skal bruge f.eks. Page_Load skriver du den bare ind.... Som standard bliver sådan en som den wired automatisk.
Det bliver du desværre nødt til at gøre med at hvad jeg har lavet... Det er på mange måder mere enkelt i webmatrix.... men det er selvfølgelig supertræls at jeg har lavet det i VS :o(
Det virker ikke rigtigt for mig på mit webhotel, jeg mistænker web.config som synderen... Skal den ikke have noget om nu hvor der lavet om i login-koden?..
Det bliver du desværre nødt til at gøre med at hvad jeg har lavet... Det er på mange måder mere enkelt i webmatrix.... men det er selvfølgelig supertræls at jeg har lavet det i VS :o( ---------------------------------------------- Hvad mente du med ovenstående?..
Okay.. Ved du hvordan man laver <img href="visImage.aspx?id=101" /> på dineBilleder.aspx så det kun er gennem dineBilleder.aspx at visImage.aspx vil vise noget?.. Hvis du forstår?..
Jo det bliver også brugt... hvis brugeren ikke er "authenticated" viderestilles brugeren til det der står angivet som loginUrl. Det er en indbygget mekanisme.
Mht det med det du spurgte om før omkring checked på at man kommet et bestemt sted fra:
Men øhh... ved egentlig ikke hvordan det vil rulle hos dig med webmatrix. Jeg har jo en klasse for hver side, så jeg kan lave noget som det her :
if(!(Context.Handler is NySide)) { Label message = new Label(); message.Text = "Du må kun komme hertil fra NySide.aspx"; Form1.Controls.Add(message); }
else { Response.Write(String.Format("Du forsøger nu at hente billede med id {0}", ImageId)); }
Hvilket så betyder, at hvis man er sendt dertil fra en anden type en NySide, så får man en fejlmelding. (og det betyder også, at hvis der er flere typer forskellige sider der skal kunne redirecte til billede.aspx kan det også lade sig gøre på en meget nem måde).
Men jeg kender som sagt ikke webmatrix særlig godt, så jeg ved ikke
Så vidt jeg ved kan man godt sætte tingene op i webmatrix så de fungerer på samme måde som i VS... man skal bare kompilere via kommandolinien hvis man vil strikke nogle dll-er sammen.
Du kan åbne filen fra koden og skrive i den programmatisk... Det er en almindelig xml-fil, og der er god understøttelse i framworket for at arbejde med den slags, men du kan også putte det i en database istedet, hvis du alligevel har sådan en kørende, og der er også muligheder for på en enkel måde at kryptere password og den slags, hvis du skulle have brug for det.
Skal vi sige det var det for iaften.. Jeg venter tilbage når jeg har lavet en acess-db med dertilhørende tabeller og relationer og ting.. Så kan du sende mig sikkert afsted ind i det lille galleri-projekt jeg har fået startet..?
Du må lige sige til, hvis du skal vise databasen... Den er helt simpelt... Har to filer nu... Det virker ikke helt, men er tæt på.. Men det C# der er ikke let at få til at virke som jeg vil have...
DataSet getSti() { string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=billeder.mdb.ressources"; IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
string queryString = "SELECT billeder.* FROM Billeder WHERE billeder.gruppeid = '" & Session["GalleriId"] & "';"; IDbCommand dbCommand = new OleDbCommand(); dbCommand.CommandText = queryString; dbCommand.Connection = dbConnection;
IDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = dbCommand; DataSet dataSet = new System.Data.DataSet(); dataAdapter.Fill(dataSet);
return dataSet; }
</script> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>LogIn</title> </head> <body> <form id="Form1" method="post" runat="server"> <asp:Repeater id="Repeater1" runat="server" DataSource="<%# getSti() %>"></asp:Repeater> <HEADERTEMPLATE> Her er en bunke billeder<br /> </HEADERTEMPLATE> <ITEMTEMPLATE> <img href="<%#Container.DataItem("sti")%>" /><br /> </ITEMTEMPLATE> <FOOTERTEMPLATE> Så var der ikke flere billeder. </FOOTERTEMPLATE> </form> </body> </html>
Jeg har lavet det hele om til VB nu, og det virker så vidt jeg kan se som det skal, med udentagelse af nogle få ting, som jeg regner med at stille et nyt spm om. Hvis du vil se det, ligger det nok de næste par uger her -> http://www.jakobj.dk/snepnet/vb.rar ... Og så kan du lægge et svar, så du kan få nogle point..
Nu siger vi at du er i subroutine i en class.. Hvordan ville du oprette en session og give den fx en string (myString) som den skal passe på, hvis du skulle skrive det i C#?..
Det gjorde tricket indtil nu.. :) Pre-complieren vil så ikke være med til denne linie heller: Server.Transfer("visGalleri.aspx",true) Den giver en fejl der hedder: System.NullReferenceException: Object reference not set to an instance of an object. Ideer?..
Det virkede fint.. Nu virker hele min login-del... I min repeater i billede-visning-delen melder fejlen: BC30201: Expression expected. På linien: <asp:Image id="Image1" runat="server" ImageUrl="<%# Container.DataItem('sti') %>"> Og hele repeateren viser således: <asp:Repeater id="Repeater1" runat="server"> <HEADERTEMPLATE> Her er en bunke billeder<br /> </HEADERTEMPLATE> <ITEMTEMPLATE> <asp:Image id="Image1" runat="server" ImageUrl="<%# Container.DataItem('sti') %>"></asp:Image> <br /> </ITEMTEMPLATE> <FOOTERTEMPLATE> Så var der ikke flere billeder. </FOOTERTEMPLATE> </asp:Repeater> En ide her også?..
Okay.. Virkede også.. Træls fejl.. :) Men der kom en ny fejl igen: System.Web.HttpException: Response is not available in this context. Fra linien: Response.Redirect("logIn.aspx") Hele sub'en: Sub Page_Unload()
If not (Context.Handler Is "ASP.Login_aspx") Then Response.Redirect("logIn.aspx") Else Repeater1.DataSource = getSti() Repeater1.DataBind() End If
Hmm.. Det med context.handler har jeg problemer med.. Så ville prøve at skrive den ud til en label.. men får denne fejl: Value of type 'System.Web.IHttpHandler' cannot be converted to 'String'. Fra: label.Text = cStr(Context.Handler) ...... Den returner ikke en string eller noget der ksn omdannes til string åbenbart..
Det kan du også... men så vidt jeg husker var den kode jeg skrev - hvor du skulle bruge Context.Handler - lavet for at du kunne sikre at man ikke fik noget resultat fra siden, med mindre man kom fra en bestemt side.
Hvad er dit problem med Context.Handler ?
Nåja... CStr er vel VB-substitutten for ToString() :o)
Hov... den med Context.Handler skal du køre i Load... Ikke i UnLoad... Du skal jo redirecte hvis folk ikke kommer fra den rigtige side... UnLoad køres til sidst... altså når alt det andet er overstået.
Jep... cStr er nemlig VB'sk for ToString()... Og Context.Handler vil ikke blive til en string... Og det var i Page_Load jeg kaldte den..... Men jeg kan gøre sådan at jeg giver Context.Items(n) en værdi, som jeg checker for på den anden side.. Det er da også okay sikkert... ikke?...
men det er også fint at gøre det med Context.Items. Men er pointen at du vil checke om folk kommer fra en bestemt side... eller om de er logget ind i den situation ?
Ja.. Men kort efter klokken 22.22 retter jeg det til Page_Load.. :) Og hvis du venter en 5 minutter med at hente så ligger jeg lige det rettede vb.rar op....
Og det var ideen.. At checke om de er logget ind..
Hvor du angiver brugerene har ikke noget at gøre med IsAuthenticated.... Der er bare indbygget funktionalitet til at trække brugerlisten ud af konfigurationen, men det betyder ikke at man er tvunget til det.
Nå.... du har jo lavet det ser det ud til... så er der jo ikke megen mening i at lave det om lige nu.... du kan jo altid prøve den anbefalde model senere :o)
Ja.. Det har jeg.. Fejl: System.Data.OleDb.OleDbException: Datatyperne stemmer ikke overens i kriterieudtrykket. Linie: dataAdapter.Fill(dataSet) Fil: visGalleri.aspx
Det er intersandt det du har pastet der.. Selvom det tager lang tid at læse alt det C#.. :)
Er dit galleriid ikke en integer ? Så burde denne her Dim sql As String = "SELECT billeder.* FROM Billeder WHERE billeder.gruppeid = '" + Session("GalleriId") + "';"
nok være Dim sql As String = "SELECT billeder.* FROM Billeder WHERE billeder.gruppeid = " + (int)Session("GalleriId") + ";"
(int)Session("GalleriId") skal du nok lave lave om et til VB-typecast istedet ;o)
Den fejler samme sted, men med fejlen: System.Data.OleDb.OleDbException: Der er ikke angivet nogen værdi for en eller flere krævede parametre. istedet for... Og man skal ikke fortælle at der kommer en integer ud af Sessionen i Vb.. :) Det finder den selv ud af..
Dim sql As String = "SELECT bruger.gruppeid FROM bruger WHERE bruger.user = '" & txtUserName.Text & "';" dbConnection = New System.Data.OleDb.OleDbConnection(connectionString) dbCommand = New System.Data.OleDb.OleDbCommand dbCommand.CommandText = sql dbCommand.Connection = dbConnection dbConnection.Open Try res = dbCommand.ExecuteScalar() Catch 'Noget.. Den mener at res er tom... End Try return res
End Function ------ Den fejlede før, så jeg satte en Try Catch ind... Kan du se hvorfor den ikke returner noget getGalleriId?..
Jeg fandt ud af det... Det skulle være bruger.nick og ikke bruger.user...
Men det rykkede kun videre til næste fejl.. Som er: System.ArgumentException: sti is neither a DataColumn nor a DataRelation for table Table. På linien: <asp:Image id="Image1" runat="server" ImageUrl='<%# Container.DataItem("sti") %>'></asp:Image>
Mht. til senere indførelse af FormsAuthentication, så er jeg med på det meste af hvad den artikel skriver, men føler mig dog usikker i dette: Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles cmdLogin.ServerClick If ValidateUser(txtUserName.Value,txtUserPass.value) Then FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _ chkPersistCookie.Checked) Else Response.Redirect("logon.aspx", True) End If End Sub --- Laver en webcontrol et serverClick hvis det forudsager et postback?.. Og hvorfor skal chkPersistCookie.Checked med?..
Nej... men hvis du bruger en almindelig htmlknap, og angiver runat="server", kan du abbonere på et ServerClick. Resultatet er det samme på serveren, som hvis du bruger en serverkontrol-knap, og abbonnerer på Click.
createPersistentCookie er den parameter der bliver angivet med chkcreatePersistentCookie.Checked.
Hvis den er true betyder det, at den cookie der genereres kan benyttes på tværs af browsersessions... I praksis betyder det så at du ikke behøver at logge ind hver gang du kommer ind på sited.
OKi.. Nu lader jeg dig slippe.. Og så går jeg ind med at lave en admin sektion også.. Så jeg stiller nok nogle spørgsmål på exp igen snart.. ;) Vi snakkes..
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.