Visualizzazione risultati 1 fino 4 di 4
Like Tree1Likes
  • 1 Post By alemoppo

Discussione: readfile() manda immagini danneggiate

  1. #1
    Guest

    Predefinito readfile() manda immagini danneggiate

    Buongiorno, vi posto il codice che ho usato:

    Codice PHP:
    <?php
    $directory
    = "foto/";
    $filecount = 0;
    $files = glob($directory . "*");
    foreach(
    $files as $valore){
    $dimensioni = getimagesize($immagine); //cose aggiuntive
    $tot = (500 * $dimensioni[1])/$dimensioni[0]; //cose aggiuntive
    echo "<input type='image' src='$valore' height='$tot'.'px' width='500px' value='$valore' name='foto'>";
    echo
    "<br/>";
    }
    if(
    $_POST['foto']){
    $filenome=explode('/', $_POST['foto']);
    echo
    $filenome[1];
    header("Content-Type: image/png");
    header("Content-Disposition:attachment;filename=".basename($filenome[1]));
    readfile($filenome[1]);
    }
    ?>
    In pratica devo contare quante immagini ci sono in una data cartella, e poi stamparle, una sotto l'altra, sotto forma di bottoni immagini.
    Quando premo sul bottone mi deve scaricare l'immagine corrispondente.
    Fin qui tutto bene, l'unico problema è che quando provo ad aprire un file appena scaricato il visualizzatore foto di windows mi dice:
    Impossibile aprire l'immagine. File probabilmente danneggiato o troppo grande.

    Cercando su google ho visto che dicevano di togliere tutti gli spazi tra <?php e readfile(), ho provato ma niente...
    Oppure dicevano di togliere ?> alla fine, ma essendo che il mio codice è tra altro codice html non lo posso fare.

  2. #2
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ti faccio notare che prima di specificare un header, non può esserci alcun output.
    Quindi già qui sorge un problema:
    Codice PHP:
    echo $filenome[1];
    header("Content-Type: image/png");
    Questo è dovuto alla struttura di una richiesta/risposta HTTP (prima c'è l'intestazione, poi il corpo).

    Inoltre, le immagini all'interno di foto/ sono in png?
    Ti consiglio di stare attento al valore di $_POST['foto'] perché potrebbe consentire ad utenti malevoli di scaricare qualsiasi file del tuo sito. Quindi filtra bene il suo contenuto prima di utilizzarlo, rimuovi .. per salire di una directory, fai in modo che il suo valore sia imprigionato nella cartella in cui si colloca.

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,067

    Predefinito

    Alcune cose:

    • Assicurati di NON scrivere nient'altro mentre stampi la foto con la readfile: qualsiasi carattere in più viene incluso nell'immagine, compromettendola. Quindi niente foreach() iniziale, niente echo dell'immagine, niente caratteri prima di <?php, niente form...
    • Devi essere sicuro che $filenome[1] sia il percorso all'immagine: secondo me potevi usare direttamente $_POST['foto'] senza explode (anche se comunque poi dovrai controllare se si tratta di un file che vuoi che sia scaricato). Se però vuoi mettere quel codice, devi farlo precedere da $directory. Inoltre, una controllata con la file_exists() per essere sicuro che il file esista, la farei.


    Questo dovrebbe andare:

    Codice PHP:
    <?php
    $directory
    = "foto/";
    $filecount = 0;
    $files = glob($directory . "*");

    if(
    $_POST['foto']){
    $filenome=explode('/', $_POST['foto']);
    //echo $filenome[1];
    $filenome[1] = $directory.$filenome[1];
    if(!
    file_exists($filenome[1]))
    echo
    'Il file '.$filenome[1].' non esiste!';
    else
    {
    header("Content-Type: image/png");
    header("Content-Disposition:attachment;filename=".$filenome[1]);
    readfile($filenome[1]);
    die();
    }
    }

    foreach(
    $files as $valore){
    $dimensioni = getimagesize($immagine); //cose aggiuntive
    $tot = (500 * $dimensioni[1])/$dimensioni[0]; //cose aggiuntive
    echo "<input type='image' src='$valore' height='$tot'.'px' width='500px' value='$valore' name='foto'>";
    echo
    "<br/>";
    }
    ?>
    EDIT: anticipato.

    Ciao!
    Ultima modifica di alemoppo : 15-06-2015 alle ore 10.53.59
    javascripter likes this.

  4. #4
    Guest

    Predefinito

    @alemoppo
    Grazie mille, ho provato il tuo codice e funziona!

    @javascripter
    Hai ragione, l'echo era una cosa che avevo messo per vedere cosa conteneva $filenome, e poi mi sono scordato di cancellarlo...
    Con cosa potrei sostituire $_POST['foto'] ? Di solito usavo mysqli_real_escape_string solo per gli input di testo, non pensavo ci fossero problemi anche sui pulsanti
    Ultima modifica di competenzepertutti : 15-06-2015 alle ore 12.09.36

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •