Avatar billede jps6kb Novice
20. august 2005 - 12:55 Der er 31 kommentarer og
1 løsning

id på flere uploadede billeder..

Hej,

Jeg har det her script, som uploader et billede.
Jeg vil nu gerne gøre det muligt at uplaode tre billeder..
Det kan jeg også godt, men det kniber lidt at få id'et på de to sidste.. jeg får på det første.

Enkelt billede upload:

' UPLOAD IMAGE SCRIPTS START
Set Upload = Server.CreateObject("Persits.Upload")

' Capture files
Upload.Save Server.Mappath("upload")

' Obtain file object
Set File = Upload.Files("FILE1")

If Not File Is Nothing Then

    ' Check size of the image
    If File.ImageWidth > 250 OR File.ImageHeight > 200 Then
      imgName = File.FileName
          Response.Redirect "nyartikel.asp?errormsg=Billedet, <b>" & imgName & "</b> er for stort"
    End If

  ' Build ODBC connection string
  Connect = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("data.mdb")

  ' Build SQL INSERT statement
  SQL = "INSERT INTO Image(image_blob, filename, description, filesize) VALUES(?, '"
  SQL = SQL & filen & "', '"
  SQL = SQL & Replace(Upload.Form("DESCR"), "'", "''") & "', "
  SQL = SQL & File.Size & ")"

  ' Save to database
  File.ToDatabase Connect, SQL

Set RS = MyConn.Execute("SELECT max(id) from [Image]")
newid = RS(0)

Else
  newid = 0

End if

' UPLOAD IMAGE SCRIPT SLUT

Hvordan gør jeg med tre? Skal bruge ex. newid1 newid2 newid3 i stedet for newid .. ;)
Avatar billede nielle Nybegynder
20. august 2005 - 13:30 #1
Hvorfor gentager du ikke bare din kodeblok 3 ganeg, med 1-tallet skifetet ud med et 2-atk for anden gang, og et 3-tal for tredje? Og med newid1, newid2 og newid3 i stedet for blot newid?
Avatar billede nielle Nybegynder
20. august 2005 - 13:31 #2
I øvrigt bør du bruge:

Set RS = MyConn.Execute("SELECT @@IDENTITY AS nytID from [Image]")
newid1 = RS("nytID")

i stedet for:

Set RS = MyConn.Execute("SELECT max(id) from [Image]")
newid = RS(0)
Avatar billede jps6kb Novice
20. august 2005 - 13:32 #3
Jeg har prøvet.. uanset hvad, så får jeg det samme id..

Hele scriptet ser sådan ud.. bliver de ikke også først gemt til sidst??

<%@LANGUAGE="VBScript"%>
<!--#include file="connect.asp"-->
<%
' UPLOAD IMAGE SCRIPTS START
Set Upload = Server.CreateObject("Persits.Upload")
Upload.Save Server.Mappath("upload")


'file 1
Set File = Upload.Files("FILE1")
If Not File Is Nothing Then
    If File.ImageWidth > 300 OR File.ImageHeight > 400 Then
      imgName = File.FileName
          Response.Redirect "nyartikel.asp?errormsg=Billedet, <b>" & imgName & "</b> er for stort&strTxt=" & strTxt & ""
    End If
  Connect = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("data.mdb")
  SQL = "INSERT INTO Image(image_blob, filename, description, filesize) VALUES(?, '"
  SQL = SQL & filen & "', '"
  SQL = SQL & Replace(Upload.Form("DESCR"), "'", "''") & "', "
  SQL = SQL & File.Size & ")"
  File.ToDatabase Connect, SQL
  Set RS = MyConn.Execute("SELECT TOP 1 * from [Image] ORDER BY id DESC")
  newid1 = RS("id")
  Response.write "1:"
  Response.write newid1
  Else
  newid1 = 0
End if


'file 2
Set File = Upload.Files("FILE2")
If Not File Is Nothing Then
    If File.ImageWidth > 300 OR File.ImageHeight > 400 Then
      imgName = File.FileName
          Response.Redirect "nyartikel.asp?errormsg=Billedet, <b>" & imgName & "</b> er for stort&strTxt=" & strTxt & ""
    End If
  Connect = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("data.mdb")
  SQL = "INSERT INTO Image(image_blob, filename, description, filesize) VALUES(?, '"
  SQL = SQL & filen & "', '"
  SQL = SQL & Replace(Upload.Form("DESCR"), "'", "''") & "', "
  SQL = SQL & File.Size & ")"
  File.ToDatabase Connect, SQL
  Set RS = MyConn.Execute("SELECT TOP 1 * from [Image] ORDER BY id DESC")
  newid2 = RS("id")
  Response.write "  2:"
  Response.write newid2
Else
  newid2 = 0
End if


' UPLOAD IMAGE SCRIPT SLUT


dato = Date()
strIp = request.servervariables("REMOTE_ADDR")

strTitel = Upload.Form("titel")
strTitel = Replace(strTitel, "'", "''")

strArtikel = Upload.Form("artikel")
strArtikel = Replace(strArtikel, "'", "''")

sql = "insert into [artikel](titel, artikel, created, img1, img2, img3, [ip], bruger) values('"&strTitel&"', '"&strArtikel&"', '"&dato&"', '"&newId1&"', '"&newId2&"', '0', '"&strIp&"', '"& session("thisUser")&"')"
Myconn.execute(sql)
'<!--#include file="formmail.asp"-->
'Response.redirect("index.asp")

%>


Har bare prøvet med to...
Avatar billede nielle Nybegynder
20. august 2005 - 13:42 #4
Hvad gør denne stump kode?

File.ToDatabase Connect, SQL
Avatar billede jps6kb Novice
20. august 2005 - 13:45 #5
Må være den første til at give fortabt.. det er første gang jeg bruger ASPUpload.. det er et eksempel jeg fik herinde.. og det virker også meget godt med ét billede.. :)
Avatar billede jps6kb Novice
20. august 2005 - 13:54 #6
Kan man ikke sige newid2 = newid1 + 1 eller noget?
Avatar billede nielle Nybegynder
20. august 2005 - 13:56 #7
Har du et link til det spørgsmål?
Avatar billede jps6kb Novice
20. august 2005 - 14:00 #8
Okay, ser ud til jeg har fået det herfra ;)

http://www.aspupload.com/manual_memory.html
Avatar billede nielle Nybegynder
20. august 2005 - 14:06 #9
Ok så er det klart at du hele tiden trækker det samme id - du lægger nemlig slet ikke noget i databasen. Filerne bliver udelukkende lagt i filsystemet.

Du konstruere pænt nogle SQL-sætninger til at indsætte men de bliver bare aldrig udført.
Avatar billede jps6kb Novice
20. august 2005 - 14:13 #10
Det forstår jeg ikke? Altså, filerne kommer ind i databasen.. det er kun id'et for hvert billede jeg ikke kan udskille.. hvis jeg går ind og ændrer det manuelt, virker det fint.. :)
Avatar billede nielle Nybegynder
20. august 2005 - 14:18 #11
Min fejl... Jeg spurgte til hvad File.ToDatabase betød og så henviste du til en side hvor den ikke forekom på ... og så sprang jeg til en lidt for hurtig konklusion.
Avatar billede nielle Nybegynder
20. august 2005 - 14:19 #12
Denne her side er meget mere relevant:

http://www.aspupload.com/manual_db.html
Avatar billede jps6kb Novice
20. august 2005 - 14:22 #13
Ja, det er også den jeg brugte.. tog bare det link jeg fik ;)
Men vil den eneste måde ikke være, at lægge en til den første newid ?
Avatar billede nielle Nybegynder
20. august 2005 - 14:24 #14
Det fungere sikkert - men det er egentligt ikke den rigtige måde at gøre det på.

Har du prøvet med:

Set RS = MyConn.Execute("SELECT @@IDENTITY AS nytID from [Image]")
newid1 = RS("nytID")

- som jeg forslog tidligere?
Avatar billede jps6kb Novice
20. august 2005 - 14:31 #15
Der bliver begge id = 0
Avatar billede nielle Nybegynder
20. august 2005 - 14:33 #16
Hvordan er dit id-felt defineret?
Avatar billede jps6kb Novice
20. august 2005 - 14:34 #17
Defineret? Det er autonummering hvis det er det du mener?
Avatar billede nielle Nybegynder
20. august 2005 - 14:35 #18
Og primary key?
Avatar billede jps6kb Novice
20. august 2005 - 14:35 #19
Jep..
Avatar billede nielle Nybegynder
20. august 2005 - 14:38 #20
Så er der s** et eler andet meget mystisk med din database :^|

Hvordan ser din kode ud nu?
Avatar billede jps6kb Novice
20. august 2005 - 14:40 #21
' UPLOAD IMAGE SCRIPTS START
Set Upload = Server.CreateObject("Persits.Upload")
Upload.Save Server.Mappath("upload")


'file 1
Set File = Upload.Files("FILE1")
If Not File Is Nothing Then
    If File.ImageWidth > 300 OR File.ImageHeight > 400 Then
      imgName = File.FileName
          Response.Redirect "nyartikel.asp?errormsg=Billedet, <b>" & imgName & "</b> er for stort&strTxt=" & strTxt & ""
    End If
  Connect = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("data.mdb")
  SQL = "INSERT INTO Image(image_blob, filename, description, filesize) VALUES(?, '"
  SQL = SQL & filen & "', '"
  SQL = SQL & Replace(Upload.Form("DESCR"), "'", "''") & "', "
  SQL = SQL & File.Size & ")"
  File.ToDatabase Connect, SQL
  Set RS = MyConn.Execute("SELECT @@IDENTITY AS nytID from [Image]")
  newid1 = RS("nytID")
  Response.write "1:"
  Response.write newid1
  Else
  newid1 = 0
End if


'file 2
Set File = Upload.Files("FILE2")
If Not File Is Nothing Then
    If File.ImageWidth > 300 OR File.ImageHeight > 400 Then
      imgName = File.FileName
          Response.Redirect "nyartikel.asp?errormsg=Billedet, <b>" & imgName & "</b> er for stort&strTxt=" & strTxt & ""
    End If
  Connect = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("data.mdb")
  SQL = "INSERT INTO Image(image_blob, filename, description, filesize) VALUES(?, '"
  SQL = SQL & filen & "', '"
  SQL = SQL & Replace(Upload.Form("DESCR"), "'", "''") & "', "
  SQL = SQL & File.Size & ")"
  File.ToDatabase Connect, SQL
  Set RS = MyConn.Execute("SELECT @@IDENTITY AS nytID2 from [Image]")
  newid2 = RS("nytID2")
  Response.write "  2:"
  Response.write newid2
Else
  newid2 = 0
End if


' UPLOAD IMAGE SCRIPT SLUT

Således.. og det efterfølgende er det samme som ovenover ;)
Avatar billede nielle Nybegynder
20. august 2005 - 14:43 #22
Du skal vist huske at skrive Upload.Form("DESCR1") og Upload.Form("DESCR2") i stedet fro Upload.Form("DESCR"). Ellers er det da det samme som bliver lagt i tabellen hver gang.
Avatar billede jps6kb Novice
20. august 2005 - 14:45 #23
Indholdet af image tabellen passer.. der er ikke noget galt med det..
Det kommer her jo
Set File = Upload.Files("FILE1")
Set File = Upload.Files("FILE2")
Avatar billede nielle Nybegynder
20. august 2005 - 14:55 #24
Hmmm, det er meget sjældent at jeg må give op, men dette er altså et af tilfældene.

Det er 100% at @@IDENTITY burde virke men det gør den altså ikke. Den eneste umiddelbare grund jeg han give er at databasen måske beslutter sig for at vente med at skrive til et senere tidspunkt for at belaste serveren så lidt som muligt.

Well, hvis metoden med at lægge 1 til det første for hvert billede fungere for dig så synes jeg at du skal bruge den. Problemet med denne opstår hvis der er to brugere som prøver at gøre det samme på samme tidspunkt – i dette tilfælde ville der kunne komme rod i id'erne for den ene og den anden bruger. Du er selv den bedste til at vurdere hvortit dette ville kunne ske.

Afslutningsvis vil jeg fraråd at du overhovedet lægger billeder i en database. Det giver langt bedre performance at have dem ude i filstrukturen.
Avatar billede jps6kb Novice
20. august 2005 - 15:00 #25
Jeg har tænkt på det, men jeg satser på forholdsvis få brugere, og funktionen vil blive brugt 1 - 2 gange om ugen pr. bruger, max.

Hvordan skal jeg skrive det med +1?
Jeg har forsøgt mig, men får hele tiden det nye ID til at blive 1 ..
Avatar billede nielle Nybegynder
20. august 2005 - 15:03 #26
Prøv de metoder som du selv lagde ud med:

SELECT Max(id) FROM Image

- eller:

SELECT TOP 1 id FROM Image ORDER BY id DESC

(Brug den første - den kræver mindst resourcer).
Avatar billede jps6kb Novice
20. august 2005 - 15:05 #27
Ahh ja, men jeg mener.. når jeg har newid1 .. hvordan skriver jeg så, korrekt + 1 til den?
Avatar billede nielle Nybegynder
20. august 2005 - 15:09 #28
Den korrekte måde var jo at bruge @@IDENTITY men den virker bare ikke.

Derfor må vi "snyde":

SQL = "SELECT Max(id) AS MaxId FROM Image"
Set RS = MyConn.Execute(SQL)
newid1 = RS("MaxId")
newid2 = newid1+1
newid3 = newid2+1
Avatar billede jps6kb Novice
20. august 2005 - 15:13 #29
Det vil den ikke så gerne..


22: SQL = "SELECT Max(id) AS MaxId FROM Image"
23: Set RS = MyConn.Execute(SQL)



Microsoft JET Database Engine error '80040e14'

Syntax error in FROM clause.

/fisk/strartikel.asp, line 23
Avatar billede nielle Nybegynder
20. august 2005 - 15:17 #30
Måske er Image et reserveret ord (og burde derfor ikke bruges som tabelnavn):

SQL = "SELECT Max(id) AS MaxId FROM [Image]"
Avatar billede jps6kb Novice
20. august 2005 - 18:52 #31
Selvfølgelig.. ved du hvad. den køber vi bare den her.. så må jeg overveje alternativerne til det her.. grunden til at jeg vil have billederne i en db, er at jeg så slipper for at bekymre mig om filnavne.. ;)

Smid lige et svar.. og mange tak for hjælpen.
Avatar billede nielle Nybegynder
20. august 2005 - 21:59 #32
Et svar :^)
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
Kurser inden for grundlæggende programmering

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