Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di mdx92
    Registrato dal
    Sep 2007
    Messaggi
    116

    [DOC] Script completo e funzionante solo per voi! by MDXstudios

    Salve a tutti raga!..

    Stò scrivendo questo post perchè girando e rigirando questo forum non ho mai trovato nulla che mi desse soddisfazione riguardo l'argomento che stò per trattare.

    Questo mio script ha le seguenti funzioni:

    - Upload di immagini con: Controllo peso (kb), Controllo dimensioni (pxl), Controllo file con stesso nome, Controllo del formato (gif, jpg, png);

    - Ridimensionamento della foto;

    - Creazione di un thumbnail (anteprima);

    - Cancellazione del file originale in quanto è stato ridimensionato ed'è stato ridotto il peso.

    Il file è testato e in uso da un sito, di seguito lo script e le varie spiegazioni.

    PASSO 1:

    Per prima cosa dobbiamo creare un form, che ci consenta di selezionare la foto dal hdd e successivamente di poterla caricare sul server del nostro sito;
    ecco lo script della pagina: index.htm

    <center><form action="upload.php" method="post" enctype="multipart/form-data">

    <h3>Selezione il file da caricare</h3>

    <input name="image" type="file" size="40" />




    <input name="upload" type="submit" value="Carica" />

    <h4>Si prega di non cancellare la scritta sottostante, grazie!</h4>
    <h6>Power by MDXstudios</h6>
    </form>
    PASSO 2:

    Ora andiamo a creare la pagina che ci consentirà l'upload e tutte le varie funzioni allegate,
    lo script verrà suddiviso il 4 step;
    ecco il primo step della pagina: upload.php

    step1 - Upload della foto con relativi controlli

    <?php
    do {
    if (is_uploaded_file($_FILES['image']['tmp_name'])) {
    // Controllo del peso in kb
    if ($_FILES['image']['size'] > 100000000) {
    $msg = "

    Il file non deve superare i tot KB!!</p>";
    break;
    }
    // Ottengo le informazioni sull'immagine
    list($width, $height, $type, $attr) = getimagesize($_FILES['image']['tmp_name']);
    // Controllo che le dimensioni (in pixel) non superino i 3000x3000
    if (($width > 3000) || ($height > 3000)) {
    $msg = "

    Dimensioni non corrette!!</p>";
    break;
    }
    // Controllo che il file sia in uno dei formati GIF, JPG o PNG
    if (($type!=1) && ($type!=2) && ($type!=3)) {
    $msg = "

    Formato non corretto!!</p>";
    break;
    }
    // Verifico che sul sul server non esista già un file con lo stesso nome
    // In alternativa potrei dare io un nome che sia funzione della data e dell'ora
    if (file_exists('up/temp/'.$_FILES['image']['name'])) {
    $msg = "

    File già esistente sul server. Rinominarlo e riprovare.</p>";
    break;
    }
    // Sposto il file nella cartella da me desiderata "up/temp"
    if (!move_uploaded_file($_FILES['image']['tmp_name'], 'up/temp/'.$_FILES['image']['name'])) {
    $msg = "

    Errore nel caricamento dell'immagine!!</p>";
    break;
    }
    }
    } while (false);
    echo $msg = "Immagine caricata!.
    Operazioni eseguite sull'immagine originale:
    ridimensionata a 400 x 300
    creato thumbnail 120 x 90
    <h6>Power by MDXstudios</h6>";
    ?>
    Spiegazione dello step1 - Upload della foto con relativi controlli:
    In questa prima parte è presente lo script che consente il vero e proprio upload,

    - Lo script inizia con il controllo del peso dell'immagine, io ho impostato il valore 100000000 in quanto l'immagine viene uploadata e immediatamente dopo cancellata quindi non'è il peso a preucuparci,

    - Il secondo passo dello script è il controllo delle dimensioni della foto in pixel anche quì ho abbondato inserendo: (($width > 3000) || ($height > 3000)) in quanto la foto verrà ridimensionata successivamente secondo le nostre direttive,

    - Il terzo controllo è quello del formato, in questo caso sono ammessi solo i formati più comuni (gif, jpg, png),

    - Il quarto ed ultimo controllo cerca nella cartella di destinazione un file (gif, jpg, png) con lo stesso nome di quello che stiamo uploadando,

    - Infine copia l'immagine nella cartella da noi impostata in questo caso "up/temp/".

    Step2 - Ridimensionamento della foto originale:

    <?php

    // Ottengo le informazioni sull'immagine originale
    list($width, $height, $type, $attr) = getimagesize('up/temp/'.$_FILES['image']['name']);

    // Creo la versione 400*300 dell'immagine
    $small = imagecreatetruecolor(400, 300);
    $cerca = imagecreatefromjpeg('up/temp/'.$_FILES['image']['name']);
    imagecopyresized($small, $cerca, 0, 0, 0, 0, 400, 300, $width, $height);

    // Salvo l'immagine ridimensionata nella cartella "up/small"
    imagejpeg($small, 'up/small/'.$_FILES['image']['name'], 75);

    ?>
    Spiegazione step2 - Ridimensionamento della foto originale:

    -Nel primo passo lo script prende tutte le informazioni necessarie per poter ridimensionare la foto originale

    -Nel secondo invece si impostano i valori di larghezza (400) e di altezza (300) della foto

    -Nell'ultimo passo lo script salva la foto ridimensionata nella cartella "up/small/"

    Step3 - Creazione del thumbnail della foto originale:

    <?php

    // Ottengo le informazioni sull'immagine originale
    list($width, $height, $type, $attr) = getimagesize('up/temp/'.$_FILES['image']['name']);

    // Creazione del thumbnail
    $thumb = imagecreatetruecolor(120, 90);
    $source = imagecreatefromjpeg('up/temp/'.$_FILES['image']['name']);
    imagecopyresized($thumb, $source, 0, 0, 0, 0, 120, 90, $width, $height);

    // Salvo l'immagine ridimensionata
    imagejpeg($thumb, 'up/tm/'.$_FILES['image']['name'], 75);

    ?>
    Spiegazione step3 - Creazione del thumbnail della foto originale:

    Lo script è identico al precedente, si devono modificare solo i paramentri di larghezza e altezza del thumbnail (120 x 90) in questo caso, e la cartella di destinazione in questo caso "up/tm/".

    step4 - Cancellazione della foto originale (in quanto sono state create due nuove immagini una da 400x300 pxl e il thumbnail da 120x90 pxl, questo passaggio lo ritengo indispensabile in qunto una foto scattata con una macchinetta in genere hanno dimensioni di 2000 e più pxl quindi ogni foto del genere peserebbe 3mb, quindi per me è da cancellare)

    <?php
    $xc = "up/temp/";
    $filename = $_FILES['image']['name'];
    $delet = "$xc$filename";
    unlink($delet);
    ?>
    Spiegazione step4 - Cancellazione della foto originale:

    -Nella prima variabile impostare il percorso della cartella dove è stata uploadata la foto originale,

    -La seconda varibile non si deve cambiare, prende il nome della foto uploadata

    -La terza variabile unisce le prime due

    -Il quarto comando è quello che ci permette di cancellare la foto originale.

    La pagina upload.php è terminata!!, ora avete il vostro upload completo e funzionante, il seguente script è stato testato sui server si Altervista e su Arruba, non hanno riscontrato nessun problema di funzionamento, basta solo un pò di pazienza nel cambiare le directori di salvataggio dei vari file, ma se non avete voglia basterà creare sul vostro ftp la seguente cartella con le relative sotto cartelle:

    mdx-upoad-->(dir principale contiene: "index.htm", "upload.php", "up(sotto dir)")

    up-->(sotto dir di "mdx-upload" contente le cartelle con le foto: "tm(contiene: thumbnails)", small(contiene: foto ridimensionate)", "temp(contiene: foto originale che verrà cancellata)")
    ATTENZIONE!!: RICORDATE DI IMPOSTARE I PERMESSI DI SCRITTURA IN TUTTE LE CARTELLE E SOTTO CARTELLE, IN CASO CONTRARIO LO SCRIPT NON FUNZIONERA' AL 100%, PER DOMANDE CHIEDETE PURE!
    Un saluto MDXstudios

  2. #2
    Utente di HTML.it L'avatar di mdx92
    Registrato dal
    Sep 2007
    Messaggi
    116
    Versione dell'upload scricabile ecco il link:
    mdx-upload.rar

    Se non dovesse funzionare ecco il link:

    http://mdx92.altervista.org/mdx-upload/mdx-upload.rar

    Oppure clicca cn il destro sul link e selezione "Salva oggetto con nome..."

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    31
    Premetto che ci capisco poco di php e mi sto interessando solo ora perchè mi serve uno script tipo quello che hai fatto tu e che probabilmente userò. Proverò a modificarlo solo per avere una larghezza massima indipendentemente dal verso dell'immagine.
    Volevo dire che subito non mi ha funzionato, ma poi, facendo qualche confronto con altri script, ho cambiato due termini ed è andato bene. E cioè: "@imagecreatefromjpeg" al posto di "imagecreatefromjpeg" e "imageCreatetruecolor" al posto di "imagecreatetruecolor". Ciao, comunque penso che mi hai risolto il problema e grazie.

  4. #4
    Beh... a quanto leggo, qualcuno può essere sicuramente contento di questo tuo lavoro, ma permettimi di fare alcune osservazioni.

    L'array $_FILES contiene un argomento chiamato ERROR.
    Ebbene, se nella form passi un campo HIDDEN con il name MAX_FILE_SIZE (ed il relativo valore), puoi tranquillamente evitarti un IF per andare ad intercettare i file di dimensioni maggiori a quanto impostato.
    In questo caso, otterresti un valore 3 (se non mi sbaglio) in $_FILES['image']['error'].
    Peraltro, se imposti allo script di accettare file da 100 MB, di sicuro ottieni l'errore 2 perché hai di sicuro superato il valore massimo di dimensione di un file in upload impostato nel PHP.INI del server.
    Questo per dire che al tuo scirpt manca un solido catching degli errori.

    Manca anche un'altra cosa fondamentale: il tuo presupposto è creare un upload di immagini, ma andrebbe fatto i maniera più solida... per esempio sfruttando da subito l'argomento TYPE di $_FILES ($_FILES['image']['type']).
    Ho visto che usi getimagesize(), che tutto sommato è un buon metodo, ma che restituisce errore nel caso un tuo incauto utente volesse caricare nel server un .EXE, un .MOV o che so io!
    Anche per questa annotazione, ti sconsiglio l'uso così nidificato di cotrolli IF/ELSE: usa piuttosto lo switch.

    Sempre a proposito del controllo sul tipo di file.
    Controlli che vengano uploadati file PNG, JPG e GIF ma nella creazione delle immagini ridimensionate (imageCreateFromxxx) non ti preoccupi di usare le funzioni giuste per ogni tipo di estensione: per cui se si dovesse caricare un PNG o un GIF, si richiama la funzione per manipolare i JPG e basta e questo dovrebbe sollevare un errore... o quantomeno generare un JPG al posto di un PNG. Problema serio se magari si vuole mantenere la trasparenza di una propria immagine.

    Non capisco cosa ci fai con il DO/WHILE nello script di upload, visto che non c'è alcun ciclo da controllare (si carica una sola foto).
    Nell'eventualità di upload multiplo, poi, ti converrebbe usare il foreach sull'array $_FILES.

    Altro punto da rivedere: la cancellazione delle immagini caricate dal server una volta effettuati i ridimensionamenti e tutto: si vede che usi una cartella particolare per l'upload e non quella di default, ma non si vede dov'è che imposti quella specifica cartella come quella di upload temporaneo delle immagini.
    Tra l'altro, credo che (ma potrei sbagliare, non sono sicuro) non sia un parametro modificabile al volo con INI_SET().

    Ultima annotazione:
    ora avete il vostro upload completo e funzionante, il seguente script è stato testato sui server si Altervista e su Arruba, non hanno riscontrato nessun problema di funzionamento, basta solo un pò di pazienza nel cambiare le directori di salvataggio dei vari file, ma se non avete voglia basterà creare sul vostro ftp la seguente cartella con le relative sotto cartelle:
    Fossi in te non generalizzerei troppo.
    Prendi un utente dalle conoscenze di PHP medio/basse.
    Copia il tuo codice (che tu dici di essere universale e funzionante) e lo manda in esecuzione sul suo server A***A Windows.
    Risultato... inizia a mandarti messaggi su messaggi che non gli funziona per nulla lo script.
    Lo sai perché? Sui server windows di solito non caricano le librerie GD.... per cui tutto il tuo sforzo sarebbe stato vanificato!

    Comunque, mdx92... mi preme spiegarti il perché di questa mia lunga risposta.
    Non volevo assolutamente trattarti male, anzi, encomio la tua volontà.
    Però......
    Nel forum ci sono decine di thread che trattano lo stesso tuo argomento, e molti di questi hanno presentato codice più evoluto di quello da te scritto.
    Lo scrivo anche per farti capire che, a prescindere dalle pillole che puoi trovarci (veri e propri tutorial), di solito il forum non dovrebbe essere un bancomat del codice dove qualcuno arriva e preleva uno script bello e fatto e magari poi si lamenta pure che non gli funziona.
    Il forum dovrebbe, invece, funzionare per chi ha problemi con un suo script (anche semplice ma pensato e scritto da sé stesso) e chiede lumi su come far funzionare il tutto.
    Basta una semplice ricerca nel forum per trovare molto codice già pronto.

    Ad ogni modo.... fai quelle migliorie di cui ti ho scritto, ed eventualmente riposta il codice in versione aggiornata.
    Magari trasformano questo thread in una Pillola!

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  5. #5
    Utente di HTML.it L'avatar di *pragma
    Registrato dal
    Sep 2001
    Messaggi
    1,087
    ottimi i suggerimenti di alcio74, ma lasceri funzionante il controllo con getimagesize().

    Parto dal fatto che chi esegue un upload potrebbe caricare qualche file assassino dal nome fittizzio p.es un ciccio.exe chiamarlo bravo.jpg
    qualsiasi controllo avviene sulla stringa del nome p.es. con pathinfo("nome")['extension'] restituisce l'estensione che è scritta e dopo averla confrontata con quelle ammissibili (jpg, jpeg, gif, png, bmp e con php5.2 anche ico) se la beve.
    Con getimagesize() legge la vera estensione .

    Secondo me è da mettere un controllo nell'input type file.
    Va bene limitare con un size, metterei anche
    $n=trim("nome") // elimina gli spazi terminali ... e quindi un upload con il focus ma in bianco
    strip_tags($n) // elimina i tag ... ed il loro contenuto
    str_replace(" ", "", $n) // elimina gli spazi intermedi
    substr($n, -30) // p.es. la lunghezza non supera i 30 caratteri (ho presente il size iniziale) compreso il punto e l'estensione

    il MAX_FILE_SIZE nell'hidden, va messo ma è poco sicuro. se si può è meglio intervenire sul php.ini bilanciando upload_max_filesize con max_esecution_time

    Questo è quello che so e posso dire.
    ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.