Gestione Immagini

Monumentale

Utente Attivo
14 Nov 2009
79
0
0
Ciao a tutti, soprattutto a Borgo che mi ha pazientemente edotto in quest'ultimo periodo.
Dopo un'altra domenica passata a smanettare sono arrivato a realizzare un form completo per l'immissione di dati alfanumerici nella mia tabella "immobili", aggiungendo, secondo me, un paio di controlli simpatici che riporto.
PHP:
$codice = $_POST['codice']; if (empty($_POST['codice'])) {$vuoto[] = "Codice ";} //verifico se dimentico di riempire un campo obbligatorio e nel caso implemento un array
........
if ((!empty($_POST['id'])) && empty($codice) || empty($categoria) || empty($tipologia) || empty($superficie) || empty($locali) || empty($bagni) || empty($condizioni) || empty($stato) || empty($descrizione))//verifico se almeno uno dei campi obbligatori è vuoto
{	$elenco_vuoti="";
	foreach ($vuoto as $item) { //se sì trasformo l'array in stringa
		$elenco_vuoti=$elenco_vuoti." ".$item;
			}
//lancio un alert Javascript con indicazione dei campi lasciati erroneamente vuoti
echo "<script language=\"javascript\" type=\"text/javascript\"> alert('Verifica inserimento $elenco_vuoti ')</script>";
echo "<script> history.back(-1) </script>";// appena chiusa la finestra popup torno indietro per non perdere quanto già compilato

Adesso avrei bisogno che mi aiutate a realizzare una pagina form alla quale potrei accedere dopo avere con successo inserito un nuovo immobile, che mantenga il riferimento dell'ultimo id (così posso incrociare le tabelle) per l'inserimento di immagini.

Ho visto che circola un esempio per la memorizzazione di immagini in una cartella che ne realizza automaticamente anche la miniatura, ed a questo proposito vi chiedo se questa trasformazione sia possibile realizzarla solamente in fase di visualizzazione quando l'utente cerca di vedere la scheda dettagliata dell'appartamento.

Luca
 
Non penso che sia una buona idea generare ogni volta la miniatura, anche se si potrebbe fare. Sprecheresti preziose risorse e potresti rallentare il caricamento della pagina. Comunque se vuoi provarci non devi far altro che crearti una pagina miniatura.php che prenda come parametro GET l'ID dell'appartamento (o altro dato univoco), generi la miniatura e invii gli header corretti. Se hai bisogno di una mano fammi sapere!
 
ciao
per far ricordare una variabile da una pag all'altra devi usare o i cookie o le sessioni (a me sono più simpatiche le seconde).
comunque se vuoi inserire le foto appena ai inserito la parte descrittiva ti ricavi l'ultimo id (che è quello dell'ultimo immobile che hai inserito) lo passi in una variabile di sessione e ti porti alla pag del form per inserimento immagini.
poi se vuoi caricare le immagini e fare le relative miniature in automatico guarda tra gli articoli di php, quello di claudio è quello che uso anche io. tieni presente che però se sei su aruba windows non funzia perche le gd non sono attive.

poi
...se questa trasformazione sia possibile realizzarla solamente in fase di visualizzazione...
si potresti realizzarla anche in fase di visualizzazione, devi tener conto però che se anche riduci le dimensioni modificando width e hegth carichi sempre un'immagine grande con conseguente rallentamento. per velocizzare è meglio avere le due immagini es.:

tumb_pinco.jpg 100x 80 px
e
pinco.jpg 600x480 px
è evidente che la prima la carichi molto più velocemente, se l'utente vuole cliccandoci sopra l'ingrandisce

p.s.
ora ti cerco l'articolo

ps.ps. incrociato con alex
 
In merito al link ho grossi problemi a farlo funzionare e mi farebbe piacere ricevere da voi alcune delucidazioni.
Prima di tutto ho tolto il link al file funzioni perché non sapendo se potrò utilizzare le GL i thumb li farò io prima di inserire (poi si vedrà).

Mi sono accorto che anche includendo il file config.php, la variabile $path_img non riesce a leggerla, così l'ho riportata manualmente anche nel mio file inserimento.php dove si trova il form.
Ho anche dovuto togliere la verifica del formato, a me non funziona e mi butta subito fuori con il messaggio "impossibile...."

A questo punto so per certo che riesco a mettere le foto nella cartella appositamente creata(tra l'altro MOOLTO lentamente), però nella tabella non ci mette nulla.

Vi posto il codice utilizzato chiedendovi la grossa cortesia di darci un'occhiata e, se possibile, di spiegarmi in modo proprio basilare come avviene l'upload di immagini PHP MYSQL perché non mi è ben chiaro (come si è già capito vero?:incazz:)
PHP:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
Immobile:<br />
<input name="id_immobile" type="text" size="20"><br />
Descrizione:<br />
<input name="descrizione" type="text" size="20"><br />
Immagine:<br />
<input type="file" name="imagefile" size="40"><br />
<input type="submit" name="Submit" value="Submit">
<br /><br />

<?php
if(isset($_POST['Submit'])){
  // faccio un po' di inclusioni...
  @include 'config.php';
  $path_img = 'foto/';// lo rimetto perché anche se inserito in config.php non lo legge

  // Creo una array con i formati accettati
  $tipi_consentiti = array("image/gif","image/jpeg","image/png");

  // verifico che il formato del file sia tra quelli accettati
  if ('1'=='1') //(@in_array($_FILES['imagefile']['type'], $tipi_consentiti))
  { 
    // copio il file nella cartella delle immagini
    @copy ($_FILES['imagefile']['tmp_name'], $path_img . $_FILES['imagefile']['name']);
	$file_temp = ($_FILES['imagefile']['tmp_name']); //dovrebbe essere il file temporaneo dove il server mete la foto uploadata


    // recupero i dati dal form
    $id_immobile = @addslashes($_POST['id_immobile']);
    $descrizione = @addslashes($_POST['descrizione']);
    $nome = @addslashes($_FILES['imagefile']['name']);
    $path = $path_img . stripslashes($nome);
	$size = @addslashes($_FILES['imagefile']['size']);
    $type = @addslashes($_FILES['imagefile']['type']);

    // creo la miniatura
    //@makeThumb($path_img,$path,$nome,$tipo);
  
    // aggiorno il database
    $query = "INSERT INTO immagini (id, id_immobile, descrizione, nome, size, type, immagine) VALUES(NULL,'$id_immobile','$descrizione','$nome', '$type', '$file_temp')";
    $res = @mysql_query($query) or die (mysql_error());
    @mysql_close($conn);

    // Stampo a video un po' di informazioni
    echo "Nome: ".$_FILES['imagefile']['name']."<br />"; 
    echo "Dimensione: ".$_FILES['imagefile']['size']."<br />"; 
    echo "Tipo: ".$_FILES['imagefile']['type']."<br />"; 
    echo "Copia eseguita con successo."; 
  }else{
    // stampo un messaggio di errore nel caso in cui il file sia di un formato non consentito
    echo "Impossibile eseguire l'upload.";
  }
} 
?>
</form>
 
So che sono uno strazio, ma voglio venirne a capo:hammer:
Ho scoperto che proprio gli include in locale (al momento sto provando solo così) non funzionano, cosa molto strana.
Il codice sotto riportato, anche se privo di molte sottigliezze mi funziona, ovviamente con i dati di accesso ben visibili. Sapete perché?
PHP:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
Immobile:<br />
<input name="id_immobile" type="text" size="20"><br />
Descrizione:<br />
<input name="descrizione" type="text" size="20"><br />
Immagine:<br />
<input type="file" name="file" size="40"><br />
<input type="submit" name="Submit" value="Submit">
<br /><br />

<?php
if(isset($_POST['Submit'])){
  // faccio un po' di inclusioni...
//include 'Connessione.php';

$db_host="127.0.0.1";
$db_user="root";
$db_password="";
$db_name="miosito";

$db=mysql_connect($db_host,$db_user,$db_password);
if ($db==FALSE) die("errore nella connessione");
mysql_select_db($db_name,$db) or die("errore nella selezione del database");

  function sicurezza($ammessi, $mime){
  for ($i=0; $i<count($ammessi); $i++){
    if(stristr($mime, $ammessi[$i])) return true;
  }
  return false;
}


$ammessi[0] = 'image';
$ammessi[1] = 'pdf';


if ($_FILES['file']['size'] <= 100000 && sicurezza($ammessi, $_FILES['file']['type']))
{ ## se il file è al max 10 kbyte faccio l'upload
  # MEMORIZZIAMO NELLA VARIABILE $file_content IL CONTENUTO DEL FILE
  $file_content = addslashes(fread(fopen($_FILES['file']['tmp_name'], 'rb'), $_FILES['file']['size']));

  # ESEGUIAMO LA QUERY DI INSERIMENTO
  $id_immobile = $_POST['id_immobile'];
  $descrizione = $_POST['descrizione'];
  $nome = $_FILES['file']['name'];
  $size = $_FILES['file']['size'];
  $type = $_FILES['file']['type'];

  $query = "INSERT INTO immagini
	    (id, id_immobile, descrizione, nome, size, type, immagine)
	    values
	    (NULL, '$id_immobile', '$descrizione', '{$_FILES['file']['name']}', '{$_FILES['file']['size']}', '{$_FILES['file']['type']}', '{$file_content}')";
  $risultato = mysql_query($query) or die (mysql_error());

  # ESITO POSITIVO
  print "<h2>Il file ".basename($nome)." è stato inserito correttamente nel Database.</h2><br />$nome $size $type";
}
else {
  print "<h2>Il file ".basename($nome)." è superiore ai 10 kbyte oppure non è del tipo corretto!!<br />Inserimento non effettuato</h2>";
	}
}
?>
 
ciao
cosa intendi con
...proprio gli include in locale....
la funzione include funzia sia in locale che in remoto, guarda che non sia un problema di percorso.
inoltre mentre fai le prove togli tutti que silent altrimenti non capisci dove ti da l'errore.
es.
@include 'config.php';
se non trova il file non te lo dice, mentre se scrivi così
include 'config.php';
in caso di errore php ti avvisa, eventualmente li rimetti quandi hai finito e sei sicuro di non avere errori
 
Domanda, il mio file di connessione in locale si trova nella cartella di Easyphp www\miosito\ però anche il file da cui viene lanciato l'include, di conseguenza non ho specificato alcun percorso, ho fatto male???
 
ciao
se i due file sono nella stessa cartella non devi mettere il percorso, se invece il file da includere si trova in una cartella diversa si
es se il file che lancia il comando e il file da includere sono entrambi nella
miosito/
basta
include 'da_includere.php'
se invece 'da_includere.php' è in un altra es
miosito/includere/
devi scrivere
include 'includere/da_includere.php'
 
Allora avevo capito bene, e così non mi funziona ed è un grosso problema se questo continuasse anche sul server Aruba, sarebbe vano ogni tentativo di creare procedure di login sicure.

Non è che ti/vi viene in mente qualche soluzione?
 
Ok ho scoperto che non posso utilizzare include con path abbreviato, devo sempre mettere tutto il percorso, però so anche che è possibile abilitare il path breve agendo sul file di configurazione.

Mi sapete dire dove si trova e qual'è il parametro da modificare?

Luca
 
intendo dire che se i due files si trovano nella stessa cartella non devo scrivere
include 'C:\programmi\easyphp\ww\connect.php' ma semplicemente
include 'connect.php'

Come anche suggerisce Borgo.
So che si tratta di un settaggio
 
ciao
scusa ma questa non la capisco.
scusa fai una semplice prova
fai un file php
PHP:
<?php
include_once 'prova,php';
?>
poi nel file prova,php scrivi
PHP:
<?php
echo "sono stato incluso";
?>
e poi chiama il file
 
Ultima modifica:
Comunque che io sappia non c'è nessun settaggio per abilitare l'uso del "path abbreviato" come dici tu (che si chiama path relativa). Al massimo c'è la direttiva include_path che definisce tutte le path in cui PHP deve cercare i file da includere, ma è un'altra cosa.
 
Scusate sono un povero cog...ne:incazz2: nel file di connessione avevo aperto male la sessione php.

Già che ci sono volevo fare il punto e chiedere consiglio.

Mi trovo un db con due tabelle, una immobili e l'altra immagini, che posso incrociare attraverso il campo id_immobile.
Volendo mantenere preselezionato l'id_immobile passando dal form inserimento caratteristiche immobile a quello inserimento foto mi pare di aver capito che devo usare le classi (perché se i cookies sono disabilitati è un problema), mi fate un esempio magari?
Una variabile di tipo globale non andrebbe bene vero?

Inoltre, siccome non so cosa sono queste GL (presuppongo librerie di funzioni) e non sono sicuro che le avrò a disposizione, non posso realizzare una funzione per crearmele in fase di inserimento foto, in modo alternativo?

Immaginando di avere correttamente popolato le mie tabelle db, ho già creato una pagina di selezione e visualizzazione degli immobili riportando solo alcuni dati principali in una tabella.
Da quì mi servirebbe associare all'immagine principale il link alla pagina di visualizzazione dettagliata dell'immobile, idee?

Grazie per il supporto e scusate per il mio bassissimo livello:(
 
gd
GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.1.9
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled

Tornando Al mio sito, siccome adesso che ho, almeno in locale, risolto quasi tutti i problemi che avevo legati alla popolazione di tabelle, vorrei sapere se il mio server Aruba ha caricate le librerie GD necessarie a far girare lo script per la realizzazione automatica delle miniature immagini.
Quello sopra è un estratto della phpinfo() del server, ci capite?

Luca
 
ciao
da quanto hai postato sembrerebbe che le GD siano attive.
pero questo mi fa pensare che tu sia su aruba linux o aruba linux+windows e non su aruba windows.
se si su aruba linux fai attenzione alle maiuscole/minuscole anche nei nomi dei file.

concludendo se le gd sono attive lo script dovrebbe funzionarti
 
Ottimo, adesso me lo studio, anche se mi sembrava di aver visto che, così come realizzato non salvava le thumbs nella tabella, ma in una cartella con path pre definito, il che significa che devo ancora smanettarci.
Di quell'esempio ho già apportato modifiche per aprire il file uploadato e salvarlo in una variabile da usare nella insert. Questo sotto riportato è il codice in questione, sapresti tradurmelo alla lettera, io l'ho copiato e funziona ma l'ho capito in parte, alcuni usano una sintassi un poco diversa.
PHP:
$file_temp = addslashes(fread(fopen($_FILES['imagefile']['tmp_name'], 'rb'), $_FILES['imagefile']['size']));

Siccome ho deciso di usare le tabelle e non la cartella immagini, cosa ne pensi se ad ogni riga mi salvo sia l'immagine originale che la sua thumb, così da potermi caricare l'una o l'altra all'occorrenza?

Un abbraccio
Luca
 
ciao
fopen apre il file e r in sola lettura (forse mi sbaglio ma il b non esiste)
http://it.php.net/manual/en/function.fopen.php
fread lo legge per quanti byte specificati
http://it.php.net/manual/en/function.fread.php

addslashes aggiunge uno slashes dove serve es. pinco's diventa pinco\'s (stripslashel le toglie)
ti consiglio di consultare il manuale ufficiale php
http://it.php.net/manual/en/index.php
se nella casella di ricerca inserisci il nome della funzione ti porta alla sua descrizione
 

Discussioni simili