- Home
- Categorie
- Coding e Sistemistica
- PHP
- script per l'upload
-
script per l'upload
Ciao ragazzi, mi sono appena iscritto, arrivo da google cercando uno script come in titolo.
Ho letto che Albanopower ha realizzato uno script che può anche rinominare i files, oltre a dare il percorso completo del file con i tag img per inserirlo direttamente nei post se non ho capito male.
Nel mio sito dispongo già di uno sript per l'upload, ha tutto ma manca proprio la possibilità di rinominare in automatico un file se è già presente uno uguale.
Leggendo fino all'ultimo post non mi sembra di aver trovato il codice completo o forse dato che non capisco gran che di php non ho capito se ci sono diversi spezzoni da mettere insieme per realizzarlo. Mi farebbe un gran piacere se chi lo ha realizzato me lo rendesse disponibile. Oppure potrei postare quello in mio possesso (trovato in rete a tarda notte) per vedere insieme come fare per dargli quella funzione mancante. Fatemi sapere, buonanotte!!!
-
@Salve said:
Ciao ragazzi, mi sono appena iscritto, arrivo da google cercando uno script come in titolo.
Fatemi sapere, buonanotte!!!
Potresti usare questo codice prima della funzione copy (oppure move_upload_file)
[PHP]
$filePath = "path/dovevoglio/salvare il file/"
$fileName = $_FILES['miofile']['name'];
$ext = strtolower(strrchr($fileName,"."));
while(file_exists($filePath.$fileName)) {
if($cc==1) $fileName = eregi_replace($ext, "-".$cc.$ext, $fileName);
else $file_name = eregi_replace("-".($cc-1).$ext, "-".$cc.$ext, $fileName);
$cc++;
}
[/PHP]
In pratica non fa altro che verificare l'esistenza del file, e se esiste aggiunge "-1" prima dell'estenzione (in pratica miofile.pdf diventa miofile-1.pdf), se esisten anche questo aggiunge "-2" e così via
-
Ciao ayrton, grazie per la risposta.
Ho provato ma mi dà un errore sulla riga dove ho inserito il tuo codice:
Parse error: syntax error, unexpected T_VARIABLE in /web/htdocs/miosito/home/onda27/fileupload.php on line **66Ti posto il codice pulito del file che uso
<html> <head> <title>Upload</title> </head> <body bgcolor="#99CCFF"> <?php /* Nom : WD_Upload V2 Description : Ce script permet d'uploader des fichiers images dont les extensions sont précisées dans le tableau associatif $extensions_ok. De plus il accepte les extensions en majuscules et vérifie les caractéristiques du fichier (poids, hauteur, largeur) avant de l'uploader ou non grâce à move_uploaded_file dans le répertoire destination définit par $target. Ce répertoire doit être créé manuellement sur le serveur distant. */ ?> <code> <?php //-------------------------------------- // DEFINITION DES VARIABLES //-------------------------------------- $target = "../upload/"; // Directory di destinazione $max_size = 1250000; // Dimensione max $width_max = 600; // Larghezza max $height_max = 600; // Altezza max $extensions_ok = array("jpg","gif","png","jpeg"); //------------------------------------------------------------ // DEFINITION DES VARIABLES LIEES AU FICHIER //------------------------------------------------------------ $nom_file = $_FILES['fichier']['name']; $taille = $_FILES['fichier']; $tmp = $_FILES['fichier']['tmp_name']; $chemin = $target.$_FILES['fichier']['name']; $extension = substr($nom_file,-3); // Récupération de l'extension //--------------------------- // SCRIPT D'UPLOAD //--------------------------- if($_POST['posted']) { // On vérifie si le champ est rempli if($_FILES['fichier']['name']) { // On vérifie l'extension du fichier if(in_array(strtolower($extension),$extensions_ok)) { // On récupère les dimensions du fichier $infos_img = getimagesize($_FILES['fichier']['tmp_name']); // On vérifie les dimensions et taille de l'image if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && ($taille <= $max_size)) { // Si c'est OK, on teste l'upload if(move_uploaded_file($tmp,$chemin)) { // Si upload OK alors on affiche le message de réussite echo '<p>.....<b>Caricamento eseguito con successo!</b></p>'; echo '<p>Qui sotto in rosso trovi il link del file che hai inviato.<br /> Selezionalo con il mouse, <b>TUTTO</b>, dalla prima parentesi all?ultima, <b>COPIALO</b> con il tasto destro e incollalo nel tuo messaggio.<p></p> <b><font color="#FF0000">![image](wwx://miosito/upload/'.$_FILES['fichier']['name'].')</font></b></p>'; } else { // Sinon on affiche une erreur système echo '<p>Problema durante l?upload!</p>'; } } else { // Sinon erreur sur les dimensions et taille de l'image echo '<p>Errore di dimensioni in byte (max 1 Mb) o in pixel (max 600 pixel per lato)</p>'; } } else { // Sinon on affiche une erreur pour l'extension echo '<p>Formato file non valido, sono consentiti solo: jpg, gif, png, jpeg</p>'; } } else { // Sinon on affiche une erreur pour le champ vide echo '<p>Devi scegliere un file!</p>'; } } ?></code> <form enctype="multipart/form-data" action="<?php echo $PHP_SELF; ?>" method="POST"> <input type="hidden" name="posted" value="1"> <td>Seleziona il file da caricare</td> <input name="fichier" type="file">>>>><input type="submit" value="OK"> </form> </body> </html> ```**
-
L'errore che ho notato io è che nella prima riga manca il punto e virgola finale... Corretto qui sotto.
[php]$filePath = "path/dovevoglio/salvare il file/";
$fileName = $_FILES['miofile']['name'];
$ext = strtolower(strrchr($fileName,"."));
while(file_exists($filePath.$fileName)) {
if($cc==1) $fileName = eregi_replace($ext, "-".$cc.$ext, $fileName);
else $file_name = eregi_replace("-".($cc-1).$ext, "-".$cc.$ext, $fileName);
$cc++;
} [/php]Inoltre permettetemi una critica:Immaginiamo che nella cartella siano presenti moooolti file con la stessa radice.
Ad esempio: nomefile-[X].ext dove X è un numero progressivo ogni volta maggiore di 1.
Assumiamo di avere (lo so la cosa è un pò forzata, ma un programmatore deve raggionare anche così) tanti file come sopra descritti per quantitativo superiore al migliaio...La mia domanda è: seppure la potenza di un server non è poca... perchè comunque si deve eseguire un ciclo while per tutte le volte che non viene soddisfatta la condizione di terminazione?
Mi spiego meglio inserendo il codice che userei io:
[php]
$fileName = $_FILES['miofile']['name'];$fileName = time().$fileName;
[/php]Che ne dite?Il nome sarà sicuramente univoco. Evito tutti i controlli per file duplicati, risparmio risorse del server...
Ciò che restituisce il codice che ho scritto, non è altro che il file precedentemente caricato preceduto però dal timestamp.
-
Ciao Portatile, ho riprovato e non dà errori solo che se carico due volte lo stesso file non lo rinomina, non so dove sbaglio. Per la tua seconda soluzione non ho capito bene se $fileName = time().$fileName; deve andare sotto a $fileName = $_FILES['miofile']['name']; oppure se deve sostituire il resto del codice.
Il php per me è ancora difficile da digerire, è già tanto se sono riuscito ad inserire il percorso da restituire a video.
Al limite basterebbe un avvertimento che chiede di rinominare il file perché già ne esiste uno, ma non so come.
Altri che ho trovato in rete non funzionano...
-
Ho pensato anche che potrebbe essere un problema di varibili che sono diverse da quelle usate nel "mio" codice, ma son troppo nubbio, comunque le ho cambiate così:
$target = "path/dovevoglio/salvare il file/";
$nom_file = $_FILES['miofile']['name'];
$ext = strtolower(strrchr($nom_file,"."));
while(file_exists($filePath.$nom_file)) {
if($cc==1) $nom_file = eregi_replace($ext, "-".$cc.$ext, $nom_file);
else $nom_file = eregi_replace("-".($cc-1).$ext, "-".$cc.$ext, $nom_file);
$cc++;
}ma non succede nulla e ora mi accorgo che in questo momento mentre scrivo il codice non diventa colorato, quindi di sicuro ho sbagliato qualcosa.
-
Il tuo codice non si colora, non perchè sia sbagliato, ma perchè non hai evidenziato il codice e poi cliccato su questa immagine
giorgiotave.it/forum/images/kirsch/editor/php.gif
ovvero il BBCode per inserire codice PHP. Niente di grave comunque.
Per la riga che ti ho scritto, devi inserirla sotto
[php]$fileName = $_FILES['miofile']['name'][/php]Ti riporto tutto il codice per far si che la variabile venga sempre rinominata...
[php]<html>
<head>
<title>Upload</title>
</head>
<body bgcolor="#99CCFF">
<?php
/*
Nom : WD_Upload V2
Description : Ce script permet d'uploader des fichiers images dont les extensions sont précisées dans le tableau associatif $extensions_ok. De plus il accepte les extensions en majuscules et vérifie les caractéristiques du fichier (poids, hauteur, largeur) avant de l'uploader ou non grâce à move_uploaded_file dans le répertoire destination définit par $target. Ce répertoire doit être créé manuellement sur le serveur distant.*/
?><code>
<?php//--------------------------------------
// DEFINITION DES VARIABLES
//--------------------------------------$target = "../upload/"; // Directory di destinazione
$max_size = 1250000; // Dimensione max
$width_max = 600; // Larghezza max
$height_max = 600; // Altezza max$extensions_ok = array("jpg","gif","png","jpeg");
//------------------------------------------------------------
// DEFINITION DES VARIABLES LIEES AU FICHIER
//------------------------------------------------------------$nom_file = $_FILES['fichier']['name'];
$nom_file = time().$_FILES['fichier']['name'];
$taille = $_FILES['fichier'];
$tmp = $_FILES['fichier']['tmp_name'];
$chemin = $target.$_FILES['fichier']['name'];$extension = substr($nom_file,-3); // Récupération de l'extension
//---------------------------
// SCRIPT D'UPLOAD
//---------------------------if($_POST['posted'])
{// On vérifie si le champ est rempli
if($_FILES['fichier']['name'])
{
// On vérifie l'extension du fichierif(in_array(strtolower($extension),$extensions_ok)) { // On récupère les dimensions du fichier $infos_img = getimagesize($_FILES['fichier']['tmp_name']); // On vérifie les dimensions et taille de l'image if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && ($taille <= $max_size)) { // Si c'est OK, on teste l'upload if(move_uploaded_file($tmp,$chemin)) { // Si upload OK alors on affiche le message de réussite echo '<p>.....<b>Caricamento eseguito con successo!</b></p>'; echo '<p>Qui sotto in rosso trovi il link del file che hai inviato.<br />
Selezionalo con il mouse, <b>TUTTO</b>, dalla prima parentesi all?ultima, <b>COPIALO</b> con il tasto destro e incollalo nel tuo messaggio.<p></p>
<b><font color="#FF0000"></font></b></p>';} else { // Sinon on affiche une erreur système echo '<p>Problema durante l?upload!</p>'; } } else { // Sinon erreur sur les dimensions et taille de l'image echo '<p>Errore di dimensioni in byte (max 1 Mb) o in pixel (max 600 pixel per lato)</p>'; } } else { // Sinon on affiche une erreur pour l'extension echo '<p>Formato file non valido, sono consentiti solo: jpg, gif, png, jpeg</p>'; }
}
else
{// Sinon on affiche une erreur pour le champ vide echo '<p>Devi scegliere un file!</p>';
}
}
?></code>
<form enctype="multipart/form-data" action="<?php echo $PHP_SELF; ?>" method="POST">
<input type="hidden" name="posted" value="1">
<td>Seleziona il file da caricare</td>
<input name="fichier" type="file">>>>><input type="submit" value="OK">
</form>
</body>
</html>[/php]Un'ultima cosa, giusto per chiudere in bellezza:Se vuoi essere tranquillo al 100% sul fatto del rinominare un file ed assegnarli un nome univoco potresti ragionare (e quindi implementare) per una funzione così fatta:
Caricare più di un file nello stesso secondo non è impossibile al 100%. Pensiamo ad esempio l'utilizzo di un tale modulo in un sito con moltissimo traffico.
Cosa si può fare allora?
Sappiamo che ogni utente, quando naviga su internet ha un IP univoco.
Possiamo sfruttare anche questo dato.
Quindi unendo il timestamp con l'IP dell'utente, ovvero il codice:[php]$fileName = $_SERVER['REMOTE_ADDR'].time().$fileName;[/php]avremo sicuramente un nome che non sarà presente più di una volta nel nostro filesystem.
Se vuoi usare questa chicca sotto trovi il codice completo del tuo script
[php]<html>
<head>
<title>Upload</title>
</head>
<body bgcolor="#99CCFF">
<?php
/*
Nom : WD_Upload V2
Description : Ce script permet d'uploader des fichiers images dont les extensions sont précisées dans le tableau associatif $extensions_ok. De plus il accepte les extensions en majuscules et vérifie les caractéristiques du fichier (poids, hauteur, largeur) avant de l'uploader ou non grâce à move_uploaded_file dans le répertoire destination définit par $target. Ce répertoire doit être créé manuellement sur le serveur distant.*/
?><code>
<?php//--------------------------------------
// DEFINITION DES VARIABLES
//--------------------------------------$target = "../upload/"; // Directory di destinazione
$max_size = 1250000; // Dimensione max
$width_max = 600; // Larghezza max
$height_max = 600; // Altezza max$extensions_ok = array("jpg","gif","png","jpeg");
//------------------------------------------------------------
// DEFINITION DES VARIABLES LIEES AU FICHIER
//------------------------------------------------------------$nom_file = $_FILES['fichier']['name'];
$nom_file = $_SERVER['REMOTE_ADDR'].time().$fileName;
$taille = $_FILES['fichier'];
$tmp = $_FILES['fichier']['tmp_name'];
$chemin = $target.$_FILES['fichier']['name'];$extension = substr($nom_file,-3); // Récupération de l'extension
//---------------------------
// SCRIPT D'UPLOAD
//---------------------------if($_POST['posted'])
{// On vérifie si le champ est rempli
if($_FILES['fichier']['name'])
{
// On vérifie l'extension du fichierif(in_array(strtolower($extension),$extensions_ok)) { // On récupère les dimensions du fichier $infos_img = getimagesize($_FILES['fichier']['tmp_name']); // On vérifie les dimensions et taille de l'image if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && ($taille <= $max_size)) { // Si c'est OK, on teste l'upload if(move_uploaded_file($tmp,$chemin)) { // Si upload OK alors on affiche le message de réussite echo '<p>.....<b>Caricamento eseguito con successo!</b></p>'; echo '<p>Qui sotto in rosso trovi il link del file che hai inviato.<br />
Selezionalo con il mouse, <b>TUTTO</b>, dalla prima parentesi all?ultima, <b>COPIALO</b> con il tasto destro e incollalo nel tuo messaggio.<p></p>
<b><font color="#FF0000"></font></b></p>';} else { // Sinon on affiche une erreur système echo '<p>Problema durante l?upload!</p>'; } } else { // Sinon erreur sur les dimensions et taille de l'image echo '<p>Errore di dimensioni in byte (max 1 Mb) o in pixel (max 600 pixel per lato)</p>'; } } else { // Sinon on affiche une erreur pour l'extension echo '<p>Formato file non valido, sono consentiti solo: jpg, gif, png, jpeg</p>'; }
}
else
{// Sinon on affiche une erreur pour le champ vide echo '<p>Devi scegliere un file!</p>';
}
}
?></code>
<form enctype="multipart/form-data" action="<?php echo $PHP_SELF; ?>" method="POST">
<input type="hidden" name="posted" value="1">
<td>Seleziona il file da caricare</td>
<input name="fichier" type="file">>>>><input type="submit" value="OK">
</form>
</body>
</html>[/php]Una domanda: come mai hai scelto uno script in francese?
-
Ciao Portatile, intanto ti ringrazio molto per il tuo aiuto, ho provato la tua chicca, però c'era un errore in questo pezzo di codice: ```
$nom_file = $_SERVER['REMOTE_ADDR'].time().$fileName;per cui non mi riconosceva l'estensione così ho cambiato in ``` $nom_file = $_SERVER['REMOTE_ADDR'].time().$nom_file;
ora l'estensione viene riconosciuta ma il file non viene rinominato. Eppure ho fatto copia incolla del codice così come lo hai postato, con l'unica modifica di cui sopra.
Ho provato anche il codice subito precedente, quello con la variabile time ma ancora nulla da fare, son due ore ormai che provo in tutte le salse, dove sbaglio?P.S. l'ho scelto francese per un motivo ben preciso: alle 4 di notte era l'unico tra quelli scaricati, che funzionava e che dava il percorso a video del file; si fermava alla sola cartella però, non so come ma sono riuscito a completarlo con il nome del file ed estensione e poi ho aggiunto i tag img, la parte più facile, tanto per aiutare i meno pratici ad inserire nel post il link già bello e pronto.
Comunque quello deve essere stato un momento di grazia perché ora invece non ne vengo fuori
-
@Portaile84 said:
L'errore che ho notato io è che nella prima riga manca il punto e virgola finale... Corretto qui sotto.
[php]$filePath = "path/dovevoglio/salvare il file/";
$fileName = $_FILES['miofile']['name'];
$ext = strtolower(strrchr($fileName,"."));
while(file_exists($filePath.$fileName)) {
if($cc==1) $fileName = eregi_replace($ext, "-".$cc.$ext, $fileName);
else $file_name = eregi_replace("-".($cc-1).$ext, "-".$cc.$ext, $fileName);
$cc++;
} [/php]Inoltre permettetemi una critica:Immaginiamo che nella cartella siano presenti moooolti file con la stessa radice.
Ad esempio: nomefile-[X].ext dove X è un numero progressivo ogni volta maggiore di 1.
Assumiamo di avere (lo so la cosa è un pò forzata, ma un programmatore deve raggionare anche così) tanti file come sopra descritti per quantitativo superiore al migliaio...La mia domanda è: seppure la potenza di un server non è poca... perchè comunque si deve eseguire un ciclo while per tutte le volte che non viene soddisfatta la condizione di terminazione?
Mi spiego meglio inserendo il codice che userei io:
[php]
$fileName = $_FILES['miofile']['name'];$fileName = time().$fileName;
[/php]Che ne dite?Il nome sarà sicuramente univoco. Evito tutti i controlli per file duplicati, risparmio risorse del server...
Ciò che restituisce il codice che ho scritto, non è altro che il file precedentemente caricato preceduto però dal timestamp.
Logico.
Il mio era solo uno spunto su cui lavorare.
Poi dipende sempre da ciò che si deve fare.