• User

    rinominare immagini con nomi assurdi per fare upload

    Vorrei fare un link in un forum che apre una finestra da cui è possibile caricare una foto nel server.

    Questa finestra poi fornisce il codice bb da utilizzare nel messaggio del forum per far apparire la immagine.

    Quello che mi perplime e che non so fare è la rinominazione delle immagini. E' possibile che gli utenti inviino foto contenenti caratteri strani nel nome, spazi e quant'altro.

    Io per adesso so rinominarle per esempio usando due numeri, uno relativo alla data timestamp ed uno generato random... in questo modo tolgo i caratteri cattivi e sono sicuro che una nuova foto non va a "coprire" una vecchia foto con lo stesso nome.

    Però così facendo mi perdo le eventuali keyword nel nome delle foto.

    Come potrei impostare la risoluzione del mio problema? :mmm:


  • User

    prova con la funzione [url=http://www.php.net/htmlentities]htmlentities,
    oppure fai un cotrollo del tipo

    $nomefile_corretto="";
    for &#40;$i=0;$i<strlen&#40;$nomefile&#41;;$i++&#41;&#123;
        $c=strtolower&#40;substr&#40;$nomefile,$i,1&#41;&#41;;
        if &#40;
            &#40;&#40;asc&#40;$c&#41;>=asc&#40;'a'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'z'&#41;&#41;&#41; ||
            &#40;&#40;asc&#40;$c&#41;>=asc&#40;'0'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'9'&#41;&#41;&#41;
        &#41;
            $nomefile_corretto.=$c;
            
    &#125;
    

    Cosi il nome $nomefile_corretto conterrà solamente caratteri A-Z e 0-9.
    Se vuoi poi puoi inserire un else dopo l'if

    
          else   $nomefile_corretto.="_";
    
    

    in modo da convertire tutti gli altri caratteri in "_".

    Spero di aver capito la domanda e di esesrmi fatto capire... 😄


  • User

    Miiii, grazie, si una cosa del genere tenere caratteri alfabetici "normali" e numeri e cambiare tutti gli altri in - (lo prefisco al _ :lol: ).

    Me lo guardo e poi se ho dubbi mi faccio risentire.
    Salve.


  • Bannato User Attivo

    In pratica si crea la variabile nome dal file che si "tira su" dal form, si applica quella funzione e si da il nuovo nome all'immagine che verrà caricata nel server?


  • Bannato User Attivo

    @chalda said:

    prova con la funzione [url=http://www.php.net/htmlentities]htmlentities,
    oppure fai un cotrollo del tipo

    $nomefile_corretto="";
    for &#40;$i=0;$i<strlen&#40;$nomefile&#41;;$i++&#41;&#123;
       $c=strtolower&#40;substr&#40;$nomefile,$i,1&#41;&#41;;
       if &#40;
           &#40;&#40;asc&#40;$c&#41;>=asc&#40;'a'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'z'&#41;&#41;&#41; ||
           &#40;&#40;asc&#40;$c&#41;>=asc&#40;'0'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'9'&#41;&#41;&#41;
       &#41;
           $nomefile_corretto.=$c;
           
    &#125;
    

    Cosi il nome $nomefile_corretto conterrà solamente caratteri A-Z e 0-9.
    Se vuoi poi puoi inserire un else dopo l'if

    
         else   $nomefile_corretto.="_";
    
    

    in modo da convertire tutti gli altri caratteri in "_".

    Allora il tuo script legge di quanti caratteri è la stringa e poi per quelnome ripete un ciclo che:

    • riduce a minuscolo tutti i caratteri (giusto??? c=strtolower(substr($nomefile,$i,1)); fa questo????);
    • se trova i caratteri da a a z e da 0 a 9 li lascia inalterati;
    • se trova un carattere diverso da quelli li sostituisce con un _ giusto?

    Quindi una foto con questo nome:

    !foto vacanza 12%.jpg

    poi diventa
    foto_vacanza_12.jpg

    Ho capito esatamente o st osparando una serie di cavolate?


  • User

    Esatto.

    Un nome tipo

    !123~PrOva.jpG

    viene rinominato in
    **
    _123_prova.jpg**


  • Super User

    ti consiglio di tenerti via un contatore che aggiungerai al nome del file per creare l'univocità certa del nome del file.

    se riservi 5 caratteri per questo contatore hai a disposzione la posssibilità di caricare 99999 fotografie (che sono un bel numero).

    e non devi fare altro che concatenare il nome del file al numero generato dal tuo contatore (io uso l'id della tabella dove memorizzo i riferimenti).

    :ciauz:


  • User

    Perfetto.
    Infatti stavo pensando che per ogni foto dare la possibilità all'utente di inserire titolo della foto e quindi ho in mente di creare una tabella 😉

    Ora devo vedere come fare il cambio di nome del file uando lo copio dalla cartella temporanea a quella di destinazione. Non so come fare :bho: ma mi leggo una guida.


  • Super User

    [url=http://www.google.it/search?q=file+upload+php&start=0&ie=utf-8&hl=it&oe=utf-8&client=firefox-a&rls=org.mozilla🇮🇹official]google

    non amo rispondere solo con un link quindi aggiungo questa frasetta 😄 ma solo per dire che non c'è molto da aggiungere alla serp.

    :ciauz:


  • Bannato User Attivo

    Sto seguendo questa bella guida:
    http://www.webmasterpoint.org/php/tutorial/56.asp

    essa dopo aver fatto dei controlli sposta il file dalla dir temp a quella di destinazione e non ho capito se è a questo punto che deve intervenire un eventuale cambio del nome del file.

    Lo spostamnetio avviene tramite:

    copy&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;,"/finallocation/".$HTTP_POST_FILES&#91;'file'&#93;&#91;'name'&#93;&#41;;
    

    Supponendo che io abbia modificato il nome del file a monte come modifico la riga sopra?

    Supponiamo che il mio nuovo nome sia
    $nuovo_nome = "risultato della funzione precedente che cambia i caratteri"

    Non so se è sufficiente fare così:

    copy&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;,"/finallocation/".$nuovo_nome&#41;;
    
    ``` di sicuro non ho scfitto la riga più giusta.
    
    Pnp.net invece sposta i file con:
    

    move_uploaded_file($tmp_name, "data/$name");

    prima di tutto:
    che cosa cambia da copy a move? Il move poi consente di evitare lo unlink?
    
    E per il cambio nome in questo secondo caso?
    Basta fare:
    

    move_uploaded_file($tmp_name, "data/[/b]$nuovonome[/b]");

    
    Fiducioso in illuminanti risposte colgo l'occasione per porgere un augurio di saporiti salumi veneti.

  • Bannato User Attivo

    Quindi così funziona e mi salva un file rinominato e nella cartella desiderata? ()

    $nomefile = $HTTP_POST_FILES&#91;'file'&#93;&#91;'name'&#93;;
    $nomefile_corretto=""; 
    for &#40;$i=0;$i<strlen&#40;$nomefile&#41;;$i++&#41;&#123; 
        $c=strtolower&#40;substr&#40;$nomefile,$i,1&#41;&#41;; 
        if &#40; 
            &#40;&#40;asc&#40;$c&#41;>=asc&#40;'a'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'z'&#41;&#41;&#41; || 
            &#40;&#40;asc&#40;$c&#41;>=asc&#40;'0'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'9'&#41;&#41;&#41; 
        &#41; 
        &#123;$nomefile_corretto.=$c;&#125;
    	else  
    	&#123;$nomefile_corretto.="-";&#125;
            
    &#125;
    copy&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nomefile_corretto&#41;;
    

    Io lo provo ragazzi.

    A proposito la variaile $categoria foto dipende da un radiobutton che l'utente sceglie quando invia le foto per "macrosuddividerle" in cartelle diverse.

    Prossimamente devo aggiungere a fine nome del file un ID unico per ogni foto.
    Ciauz. :ciauz:


  • Bannato User Attivo

    Mi da questo erroraccio:
    Fatal error: Call to undefined function: asc() in /home/vhosts/skiforum.it/var/www/html/skiforum/upload-save.php on line 51

    e la riga 51 è questa:

            &#40;&#40;asc&#40;$c&#41;>=asc&#40;'a'&#41;&#41; && &#40;asc&#40;$c&#41;<=asc&#40;'z'&#41;&#41;&#41; || 
    

    E poi un dubbio.

    Il ".jpg" finale della foto viene modificato? :mmm: :mmm: :mmm:


  • Bannato User Attivo

    Ma asc che cosa è?
    Ho cercato php.net ma non ho trovat osia una funzione del PHP. Piuttosto sembra una cosa simile all'asc e desc dei comandi per mysql.

    Fatto sta che dopo un paio di settimane ancora non riesco a salvare i nomi delle foto in modo "furbo" :arrabbiato:


  • Bannato User Attivo

    Ho pensato di cambiare completamente strada e di usare questa funzione:

    #con funzione
    function make_url_friendly&#40;$url&#41; 
    &#123; 
    
        $url = strtolower&#40;$url&#41;; 
    
        $find = array&#40;' ', 
                '&', 
                '\r\n', 
                '\n', 
                '/', 
                '\\', 
                '+'&#41;; 
    
        $url = str_replace &#40;$find, '-', $url&#41;; 
    
        $find = array&#40;' ', 
                'é', 
                'è', 
                'ë', 
                'ê'&#41;; 
          
        $url = str_replace &#40;$find, 'e', $url&#41;; 
          
        $find = array&#40;' ', 
                'ó', 
                'ò', 
                'ô', 
                'ö'&#41;; 
          
        $url = str_replace &#40;$find, 'o', $url&#41;; 
          
        $find = array&#40;' ', 
                'á', 
                'à', 
                'â', 
                'ä'&#41;; 
          
        $url = str_replace &#40;$find, 'a', $url&#41;; 
          
        $find = array&#40;' ', 
                'í', 
                'ì', 
                'î', 
                'ï'&#41;; 
          
        $url = str_replace &#40;$find, 'i', $url&#41;; 
          
        $find = array&#40;' ', 
                'ú', 
                'ù', 
                'û', 
                'ü'&#41;; 
          
        $url = str_replace &#40;$find, 'u', $url&#41;; 
          
        $find = array&#40;'/&#91;^a-z0-9\-<>&#93;/', 
                '/&#91;\-&#93;+/', 
                '/<&#91;^>&#93;*>/'&#41;; 
    
        $repl = array&#40;'', 
                '-', 
                ''&#41;; 
    
        $url =  preg_replace &#40;$find, $repl, $url&#41;; 
    
        return $url; 
    
    &#125;
    $nome1 = make_url_friendly&#40;$nomefile&#41;;
    
    
    copy&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1&#41;;
    

    Funziona ma mi da un problema 😞 :arrabbiato:
    In pratica mi carica dei file senza estensione. Infatti converte il "." della estensione in un non spazio e perciò mi carica dei file del tipo:
    nome-correttojpg
    anzichè
    nome-corrett.jpg

    Come potrei agire?


  • Bannato User Attivo

    Ho capito come potrei fare.
    Basterebbe riuscire a dire allo script di NON cambiare i "." con un "nulla" ma nesì lasciarli ".".

    Come si fa? :mmm:


  • Moderatore

    Ciao.

    Al volissimo, credo che il problema sia qui:

    $find = array('/[^a-z0-9-<>]/',
    '/[-]+/',
    '/<[^>]*>/');

    $repl = array('',
            '-',
            '');
    
    $url =  preg_replace ($find, $repl, $url);
    

    In pratica, se non ho preso un abbaglio, sostituisce qualunque cosa ce non sia lettera minuscola, numero, - < > in "" ossia in nulla. Quindi anche i punti

    Dovresti aggiungere . in quella stringa per non avere problemi
    :ciauz:


  • Bannato User Attivo

    @massy said:

    $find = array('/[^a-z0-9-<>]/',
    '/[-]+/',
    '/[.]/'
    '/<[^>]*>/');

    $repl = array('',
    '-',
    '');

    $url = preg_replace ($find, $repl, $url);

    Va bene aggiunto in quel modo? :mmm:
    Grazie infinite. Davvero un grosso problema per me.


  • Moderatore

    🙂

    Io pensavo ad una cosa del genere:

    $find = array('/[^a-z0-9-<>.]/',
    '/[-]+/',
    '/<[^>]*>/');

    $repl = array('',
    '-',
    '');

    $url = preg_replace ($find, $repl, $url);

    :ciauz:


  • Bannato User Attivo

    Proverò prima il tuo codice e vi saprò dire come funziona 🙂
    Davvero grazie 😄


  • User Attivo

    questo per rinominare il file se già esiste un file con lo stesso nome:

    $path="" // lasciare nullo o inserire la dir di upload
    $nome_file = $_FILES&#91;'UploadedFile'&#93;&#91;'name'&#93;;
    while &#40;file_exists&#40;$path.$nome_file &#41;&#41;  &#123;
    echo "<h4>Il file già esiste lo abbiamo rinominato</h4>";
    $nome_file = rand&#40;1,9&#41; . "-$nome_file" ; &#125;
    

    se il file già esiste aggiunge un numero random tra 1 e 9 un trattino e il nome originale:

    foto.jpg diventa 3-foto.jpg
    

    se un file con lo stesso nome è stato uploadato 9 volte e quindi tutti i random da 1 e 9 sono stati usati si avrà questa rinominazione:

    foto.jpg diventa 4-7-foto.jpg
    

    dove 4 e 7 sono random.