5 messaggi dal 26 agosto 2010
Innanzitutto Buon Giorno a tutti!!! Sono in cerca di aiuto ed ogni soluzione è ben accetta!!!
Sono Arcangelo da Reggio Calabria.
Premettendo che è da circa un anno che mi son dato all'ASP, mi hanno chiesto di effettuare alcune modifiche su un sito già fatto (aggiungerei da una persona incompetente).
Premetto che la mia richiesta di poterlo rifare da capo a mio modo, non è stata accolta, di conseguenza DEVO risolvere il problema.
Fra le tante cose che questo sito gestisce, vi è una vetrina di Auto usate.
Il suo funzionamento è il seguente:
File: downloadadmin.asp nel quale vi sono tutti gli input (informazioni testuali e foto)
DB in Access
File: upload.asp che si occupa della connessione al DB, la conversione da string a byte, ecc... (ma credo che questo sia irrilevante per il problema)
File: cat_auto.asp che è il file che mostra a video le informazioni uploadate.
Il problema da risolvere è che l'ADMIN (perchè è solo dal lato ADMIN) debba poter uploadare 3 foto.
Lo script utilizzato dalla persona che ha creato il sito, è stato copiato e schiaffato lì, ma dava la possibilità di uploadare una sola foto e basta.
Ho agito in questo modo:

- Nel file downloadadmin, ho aggiunto altri 2 Input type:
<tr>
<td><b>Seleziona immagine:</b></td>
<td><input type="file" name="txtFile" style="font-family: Verdana; font-size: 8pt" /></td>
</tr>

- Nel DB ho aggiunto i campi per contenere le altre due foto:

percorso (public/files/)
dimimage (che già c'erano)

percorsodue (public/files/due/)
dimimagedue

percorsotre (public/files/tre/)
diimagetre

- Nel file cat_auto:
Ho modificato l'anteprima dell'immagine di with:"150"
con 3 piccole da with:"50" (così non si sfora nemmeno come dimensioni)

Alla fine funziona tutto correttamente, ma resta un PICCOLO PROBLEMA!!!

Quando su cat_auto compaiono le informazioni, i campi testuali sono corretti, le immagini appaiono tutte e tre, ma SONO UGUALI!!!

Analizzando credo che il problema sia questo ciclo:

For Each File In Uploader.Files.Items
File.SaveToDisk Server.MapPath("public/files")
File.SaveToDisk Server.MapPath("public/files/due")
File.SaveToDisk Server.MapPath("public/files/tre")
numSize = File.FileSize
numSizedue = File.FileSize
numSizetre = File.FileSize
strURL = "/public/files/" & File.FileName
strURLdue = "/public/files/due/" & File.FileName
strURLtre = "/public/files/tre/" & File.FileName
strSQL = "INSERT INTO tbl_downloads (nome, modello, annoimm, mar_id, cilindrata, descrizione, percorso, percorsodue, percorsotre, dimensioni, dimensionidue, dimensionitre, data, colore, carburante, chilometri, cambio)VALUES('" & strAuto & "','" & strModello & "','" & strAnno & "','" & strMarca & "','" & strCilindrata & "','" & strDescription & "','" & strURL & "','" & strURLdue & "','" & strURLtre & "','" & numSize & "','" & numSizedue & "','" & numSizetre & "','" & strData & "','" & strColore & "','" & strCarburante & "','" & strChilometri & "','" & strCambio & "')"
adoCon.Execute(strSQL)
Next

Che cosa fa, praticamente, prende in input le 3 immagini, ne crea tre copie per ognuno, ma quando va a ripescarle per metterle su cat_auto.asp, non prende una per ogni immagine diversa. Prende le ultime 3 copie dell'ultima immagine che ho uploadato.
Ho la riga con le informazioni e come immagini ho:
macchina1.jpg presa da percorso
macchina1.jpg presa da percorsodue
macchina1.jpg presa da percorsotre

Il ciclo originale (quello per singolo file) è questo:

For Each File In Uploader.Files.Items
File.SaveToDisk Server.MapPath("public/files")
numSize = File.FileSize
strURL = "/public/files/" & File.FileName
strSQL = "INSERT INTO tbl_downloads (nome, modello, annoimm, mar_id, cilindrata, descrizione, percorso, dimensioni, data, colore, carburante, chilometri, cambio)VALUES('" & strAuto & "','" & strModello & "','" & strAnno & "','" & strMarca & "','" & strCilindrata & "','" & strDescription & "','" & strURL & "','" & numSize & "','" & strData & "','" & strColore & "','" & strCarburante & "','" & strChilometri & "','" & strCambio & "')"
adoCon.Execute(strSQL)
Next

Vi prego aiutatemi!!!
Ho agito bene? ho speranze :-) ???
Attendo un vostro piccolo AIUTO!!!
GRAZIE!!!
547 messaggi dal 24 maggio 2002
Contributi
Non devi inserire il salvataggio delle tre immagini nel ciclo di for
For Each File In Uploader.Files.Items
questo gira tante volte quanti sono i file uploadati e salverà di conseguenza solo l'ultima immagine uploadata in tre copie sovrascrivendo quelle uploadate al giro prima.

Quello che devi fare è far si che il nome dell'immagine salvata sia diverso a ogni ciclo, cambiare di fatto questa riga
strURL = "/public/files/" & File.FileName

Puoi fare in diversi modi usare una TimeStamp oppure verificare se un file con lo stesso nome esiste già e quindi aggiungere un counter (immagine_01.jpg, immagine_02.jpg).

Tra l'altro credo ci sia quantomeno un problema nel salvare i file uploadati utilizzando il nome originale; se a distanza di tempo carichi una immagine con lo stesso nome per un'altra macchina questa sovrascriverà quella già presente!

Spero di esserti stato utile, Ciop!

Marco.
5 messaggi dal 26 agosto 2010
Ciao Marco! Innanzitutto GRAZIE infinite per avermi risposto!
Ho compreso più o meno quello che intendevi dire!
Però... uhm... cambiare quella riga come??? Potresti farmi un esempio?!?!
.. Allora... caccio il "foreach...next" che è il ciclo incriminato :-)!!! e modifico quella riga in che modo???
Grazie ancora!
Arcangelo.
Non conosco bene la sintassi dell'ASP classico, quindi ti posto un pò di sano pseudo-codice
  
   // creiamo un timestamp univoco, ci servirà per creare il nome del   file
   Dim timestamp as String = DateTime.Now.Ticks.ToString()

   // cicliamo sulla lista dei file da uploadare
   Dim index as Integer = 1
   For Each File In Uploader.Files.Items 
      
      // costruisco il nome del file concatenando il path all'index del file corrente e al timestamp, in modo che sia univoco
// (nota bene che sto omettendo l'estensione, questo lo lascio a te :) 
      Dim filePath as String = "public/files/" & index & "_" & timestamp 
      File.SaveToDisk Server.MapPath(filePath) 
   Next    


In questo modo ti assicuri che i files vengano salvati. Per quanto riguarda l'inserimento nel db, ti basta memorizzare in una lista i path durante il ciclo e poi eseguire la query al termine (oppure potresti anche usare un unico campo e concatenare le stringhe usando un separatore...)

Davide Guida
Technical Architect @ Razorfish Healthware
http://davideguida.altervista.org
547 messaggi dal 24 maggio 2002
Contributi
Perfetto quello che dice mizrael.

In sostanza, nel tuo caso, si tratta di modificare la riga di codice
strURL = "/public/files/" & File.FileName

in modo che File.Filename sia sempre diverso.

Per fare questo ti puoi sbizzarrire.

Marco.
5 messaggi dal 26 agosto 2010
Buona Sera ragazzi! Grazie per aver risposto!
Purtroppo sono ancora alle prese con questo maledetto problema! Fortunatamente sto temporeggiando risolvendo altri problemi sul sito, quindi ho ancora un po' di tempo per cercare di arrivare ad una soluzione con il vostro GRANDE AIUTO

For Each File In UploaderFilesItems
FileSaveToDisk ServerMapPath("public/files")
FileSaveToDisk ServerMapPath("public/files/due")
FileSaveToDisk ServerMapPath("public/files/tre")
numSize = FileFileSize
numSizedue = FileFileSize
numSizetre = FileFileSize
strURL = "/public/files/" & FileFileName
strURLdue = "/public/files/due/" & FileFileName
strURLtre = "/public/files/tre/" & FileFileName
Next
strSQL = "INSERT INTO tbl_downloads (nome, modello, annoimm, mar_id, cilindrata, descrizione, percorso, percorsodue, percorsotre, dimensioni, dimensionidue, dimensionitre, data, colore, carburante, chilometri, cambio)VALUES('" & strAuto & "','" & strModello & "','" & strAnno & "','" & strMarca & "','" & strCilindrata & "','" & strDescription & "','" & strURL & "','" & strURLdue & "','" & strURLtre & "','" & numSize & "','" & numSizedue & "','" & numSizetre & "','" & strData & "','" & strColore & "','" & strCarburante & "','" & strChilometri & "','" & strCambio & "')"
adoConExecute(strSQL)

End If

Mi sa che se il codice non me lo modificate voi direttamente, o se non scrivete direttamente le istruzioni da fare, non arriverò mai da nessuna parte!
VI PREGO!!! AIUTATEMI!!!
L'idea è di ciclare sul controllo Uploader inserendo i nomi dei files e le loro dimensioni in 2 array separati e salvando fisicamente i files sul server. Qualcosa del genere:

Dim filenameArray(Uploader.Files.Items.Count)
Dim fileSizeArray(Uploader.Files.Items.Count)
Dim index as Integer = 0

For Each File In UploaderFilesItems
   filenameArray(index) = "public/files/" & (index + 1.)ToString() & "/" & FileFileName
   fileSizeArray(index) = File.FileSize

   File SaveToDisk ServerMapPath(filenameArray(index))

   index = index + 1
Next



Al termine del ciclo fai la scrittura nel db, usando però i 2 array per i filenames e le loro dimensioni

PS: non sono sicuro della sintassi, il mio Classic ASP fa veramente pietà XD
Modificato da mizrael il 15 settembre 2010 1900 -
Modificato da mizrael il 15 settembre 2010 1901 -
Modificato da mizrael il 15 settembre 2010 19.03 -

Davide Guida
Technical Architect @ Razorfish Healthware
http://davideguida.altervista.org
1 messaggio dal 25 settembre 2010
Arcangelo79 - dopo le modifiche effettuate

Mi da' il seguente errore "Microsoft JET Database Engine error '80040e07'

Data type mismatch in criteria expression.

/downloadadmin.asp, line 116" che corrisponde a adoCon.Execute(strSQL)

LISTATO

If Request.querystring("mode") = "uploadprocess" Then

Set Uploader = New FileUploader
Uploader.Upload()

strAuto = Uploader.Form("txtAuto")
strData = Uploader.Form("txtData")
strModello = Uploader.Form("txtModello")
strAnno = Uploader.Form("txtAnno")
strMarca = Uploader.Form("txtMarca")
strCilindrata = Uploader.Form("txtCilindrata")
strDescription = Uploader.Form("txtDescription")
strColore = Uploader.Form("txtColore")
strCarburante = Uploader.Form("txtCarburante")
strChilometri = Uploader.Form("txtChilometri")
strCambio = Uploader.Form("txtCambio")
strAuto = fieldReplace(strAuto)
strCilindrata = fieldReplace(strCilindrata)
strDescription = fieldReplace(strDescription)
strColore = fieldReplace(strColore)
strChilometri = fieldReplace(strChilometri)


If Uploader.Files.Count = 0 Then
Response.Write "File(s) non caricati."
Else
For Each File In Uploader.Files.Items
Select case Uploader.Files.Count
Case "1"
numSize = File.FileSize
strURL = "/public/files/" & Uploader.Files.Count & File.FileName

Case "2"
File.SaveToDisk Server.MapPath("public/files")
numSizedue = File.FileSize
strURLdue = "/public/files/" & Uploader.Files.Count & File.FileName

Case "3"
File.SaveToDisk Server.MapPath("public/files")
numSizetre = File.FileSize
strURLtre = "/public/files/" & Uploader.Files.Count & File.FileName

End Select
Next
strSQL = "INSERT INTO tbl_downloads (nome, modello, annoimm, mar_id, cilindrata, descrizione, percorso, percorsodue, percorsotre, dimensioni, dimensionidue, dimensionitre, data, colore, carburante, chilometri, cambio)VALUES('" & strAuto & "','" & strModello & "','" & strAnno & "','" & strMarca & "','" & strCilindrata & "','" & strDescription & "','" & strURL & "','" & strURLdue & "','" & strURLtre & "','" & numSize & "','" & numSizedue & "','" & numSizetre & "','" & strData & "','" & strColore & "','" & strCarburante & "','" & strChilometri & "','" & strCambio & "')"

End If
adoCon.Execute(strSQL)
Set adoCon = Nothing
Response.Redirect "cat_auto.asp"

End If

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.