Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Upload + controllo file esistente

    Ciao a tutti,

    sto cercando il modo di fare rinominare il file che si tenta di caricare, se sul server esistono già, ora facendo l'esempio come da manuale php che é il segunete mi é chiaro:
    Codice PHP:
    <?php
    rename
    ("/tmp/tmp_file.txt""/home/user/login/docs/my_file.txt");
    ?>
    ma se ho il nome del file in una variabile non mi é piu chiaro perche facendo cosi mi mette per esempio il numero 1 dopo la estenzione, cioé cosi:

    foto.jpg
    foto.jpg1

    io vorrei poter ottenere

    foto1.jpg


    il mio pezzo di codice attuale é:

    Codice PHP:
    // Controllo se il file esiste

    elseif (file_exists($target_path)) {
    $msg "<span class=\"TestoLinks\">Il file $fileupload_name esiste già. Rinomina il file.</span>";
    $img "<img src=\"./image/$fileupload_name\" width=\"120\" height=\"80\">";
    $fileEsistente fopen("$fileupload_temp""r");
    fclose($fileEsistente);

    // suppongo che qui devo usare una funzione che mi trovi il punto, e prima del punto mettere 
    // 1 ma non so quale funzione¨.

    rename("$fileupload_temp""./image/$fileupload_name"1"); 
    Qualcuno mi sa dare una mano gentilmente?

    Grazie Michel
    PHP THE BEST

  2. #2
    Uppete
    PHP THE BEST

  3. #3
    L'estenzione del file fa parte del nome contenuto nella variabile quindi è normale che l'aggiunge alla fine. Dovresti salvare prima l'estenzione ed aggiungerla dopo il rename.

  4. #4
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Prova a manipolare il nuovo nome del file prima di usare rename...

    Codice PHP:
    $fileupload_name preg_replace("/(\\w+)(\\.\\w+)/",
                                    
    "\${1}1\$2",
                                    
    $fileupload_name); 

  5. #5
    Ciao grazie per la dritta,

    cosi mi funziona alla grande però ammettiamo che ci sia anche un terzo file da caricare con lo stesso nome, come posso fare per incrementare il numero?

    esempio.jpg
    esempio1.jpg
    esempio2.jpg

    Codice PHP:
    // Controllo se il file esiste metto un numero prima del punto

    elseif (file_exists($target_path)) {
    $FileOriginale $fileupload_name;
    $fileEsistente fopen("$fileupload_temp""r");
    $msg "<span class=\"TestoLinks\">Il file $fileupload_name esiste già. Rinomina il file.</span>";
    fclose($fileEsistente);
    /* $num = "0";
    $num++; Qui se faccio cosi mi aumenta fino all'esempio1.jpg 
    poi se provo a metterne un'altro mi da un errore warning 
    che dice che il file esiste già, questo lo so ma non so come rimediare
    */
    $fileupload_name preg_replace("/(\w+)(\.\w+)/","\${1}$num\$2",$fileupload_name);
    rename("$fileupload_temp""./image/$fileupload_name");
    $msg "<span class=\"TestoLinks\">Il file $FileOriginale é stato rinominato: $fileupload_name </span>";
    $img "<img src=\"./image/$fileupload_name\" width=\"120\" height=\"80\">";

    Grazie e scusate ma non sono molto esperto come potrte notare.

    Thx Michel
    PHP THE BEST

  6. #6
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Senza precisi riferimenti sui caratteri ammessi e non è abbastanza contorto trovare un modo per rendere il codice di facile adattamento...

    Fai delle prove e controlla il funzionamento. Unica limitazione, ma indispensabile, è che dovresti impedire l'uso del carattere underscore ( _ ) quando chiedi di inserire il nome per il file da uploadare. Magari lo sotituisci con il trattino ( - ), fai un po' tu.

    Per integrarlo al tuo codice inseriscilo al posto di queste righe:

    /* $num = "0";
    $num++; Qui se faccio cosi mi aumenta fino all'esempio1.jpg
    poi se provo a metterne un'altro mi da un errore warning
    che dice che il file esiste già, questo lo so ma non so come rimediare
    */
    $fileupload_name = preg_replace("/(w+)(.w+)/","\${1}$num\$2",$fileupload_name);


    Codice PHP:
    //se il file esiste ed ha un nome standard tipo "esempio.txt"
    //e, fondamentale, senza nessun carattere underscore ( _ )
    //verrà semplicemente rinominato in "esempio_1.txt"
    $f = &$fileupload_name;

    if(!
    preg_match("/.+(_)\\d*\\.\\w+/"$f)) {
    $f preg_replace("/(\\w+)(\\.\\w+)/""\\${1}_1\\$2"$f);
    } else {

    //se invece il file esiste ma ha già un nome tipo "esempio_1.txt"
    //verrà rinominato aumentando progressivamente il numero che lo
    //identifica. Es: esempio_2.txt, esempio_3.txt, etc...
    $i preg_match("/(.+)_(\\d+)\\.(.+)/"$f$mth);
    $i $mth[2] +1;
    $f preg_replace("/(.+)(_\\d+\.)(.+)/""\\$1_$i.\\$3"$f);


  7. #7
    Grazie per ques'altra soluzione, ma non é propio quella che cercavo.

    Mi spiego meglio:

    ora usando il tuo codice ho notato che copio per esempio il file esempio.jpg sul server senza problemi, poi se copio lo stesso file esempio.jpg me lo rinomina in esempio_1.jpg ma se provo a copiare per la terza volta il file esempio.jpg mi da un warning che mi dice che il file esiste, questo lo capito ma non so risolvere.

    Ho provato a copiare per esempio il file esempio_1.jpg sul server che é già presente e ho notato che me lo rinomina giustamente in esempio_2.jpg però non é questo che esattamente volevo.

    Protresti gentilmente darmi una mano nel risolvere il mio problema?


    Codice attuale:

    Codice PHP:
    // Controllo se il file esiste metto un numero prima del punto

    elseif (file_exists($target_path)) {
    $FileOriginale $fileupload_name;
    $fileEsistente fopen("$fileupload_temp""r");
    $msg "<span class=\"TestoLinks\">Il file $fileupload_name esiste già. Rinomina il file.</span>";
    fclose($fileEsistente);

    //se il file esiste ed ha un nome standard tipo "esempio.txt"
    //e, fondamentale, senza nessun carattere underscore ( _ )
    //verrà semplicemente rinominato in "esempio_1.txt"

    $f = &$fileupload_name;

    if(!
    preg_match("/.+(_)\d*\.\w+/"$f)) {
    $f preg_replace("/(\w+)(\.\w+)/""\${1}_1\$2"$f);
    } else {

    //se invece il file esiste ma ha già un nome tipo "esempio_1.txt"
    //verrà rinominato aumentando progressivamente il numero che lo
    //identifica. Es: esempio_2.txt, esempio_3.txt, etc...

    $i preg_match("/(.+)_(\d+)\.(.+)/"$f$mth);
    $i $mth[2] +1;
    $f preg_replace("/(.+)(_\d+.)(.+)/""\$1_$i.\$3"$f);
    }
    rename("$fileupload_temp""./image/$fileupload_name");
    $msg "<span class=\"TestoLinks\">Il file $FileOriginale esiste già sul server ed é stato rinominato in $fileupload_name </span>";
    $img "<img src=\"./image/$fileupload_name\" width=\"120\" height=\"80\">";

    Grazie Michel
    PHP THE BEST

  8. #8
    Up.
    PHP THE BEST

  9. #9
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Si, in effetti a questo non avevo ancora pensato... in teoria avremmo bisogno di ciclo che controlli tutte le varianti possibili per il nome del file (esistente, ovvio) che si tenta di caricare. Questo perchè, come hai notato anche tu provando lo script, tutto funziona bene fino a quando si cerca di eseguire l'upload di un file per il quale non è stata privista un ulteriore possibilità di ridenominazione.

    Al momento non ho modo di mettere insieme qualcosa di concreto, posso consigliarti un modo alternativo che non mi ha mai dato nessun problema fino ad ora. Si tratta però di doversi affidare in parte al javascript, quindi con tutti i pro e i contro del caso, vedi ad esempio se l'utente che utilizzerà lo script dovesse aver disabilitato js dal proprio browser il file verrebbe sovrascritto direttamente...

    Dicevo "sovrascritto direttamente" perchè la soluzione è semplicemente quella di sovrascrivere il file ma, ovviamente, avvertendo prima l'utente di quello che sta per essere elaborato dallo script.

    Abbiamo una funzione che si occupa di visualizzare un messaggio con la classica finestra del confirm() in javascript e quindi se si clicca su "Avanti" si procede mentre se si sceglie "Annulla" si torna indietro e nel nostro caso si offre la possibilità all'utente di rinominare manualmente il file che stava tentando di caricare. Tutto qui...

    La funzione

    Codice PHP:
    function confirm_msg($msg) {
    echo 
    "<script>if(!confirm(\"$msg\")) history.back();</script>";

    Il controllo sull'esistenza del file

    Codice PHP:
    if(file_exists($fileupload_name)) confirm_msg('Sovrascrivere il file '.$fileupload_name.' ?');

    /*
    prosegui con l'upload del file sovrascrivendolo
    mentre se l'utente dovesse aver scelto di annullare l'operazione ritornerebbe alla pagina
    precedente dove potrebbe scegliere un nome diverso per il file da caricare.
    ovviamente dovrai aggiungere un semplice campo di testo al form per l'invio del file
    proprio per dare la possibilità di scegliere un nome nuovo.
    */ 
    Ah, è dato per scontato, al posto di javascript potresti anche pensare di aggiungere un semplice exit(); usando direttamente solo php per terminare lo script proprio nel punto in cui si verifica l'errore.

    Mi spiace di non poterti aiutare percorrendo la strada iniziata prima ma al momento non ne ho la possibilità. Prova con la soluzione alternativa e vedi se ti riesce di risolvere così.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2002
    Messaggi
    119
    Ciao ho un problema simile. Vorrei evitare che gli utenti carichino file che contengano nel nome le parentesi quadre (per capirci [ e ] ) vorrei (se presenti nel nome che fossero sostituite con quelle tonde.

    Ho fatto questo tipo di condizione per le estensioni:

    Codice PHP:
             // File vietati
            
    $upload_denied_extentions = array( "exe""pl""php""php3""php4""php5""phps""asp","cgi""html""htm""dll""bat""cmd" );
            foreach (
    $upload_denied_extentions AS $denied_extention) {
              if(
    $denied_extention == $extension) {
                echo(
    'That filetype is not allowed');
                exit;
              } 

    Non so come fare però la stringa per i caratteri non validi...

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.