Pagina 1 di 2

Uploader php

Inviato: mar giu 15, 2010 10:50
da Ansa89
Sto cercando di scrivere un uploader php con un po' di difficoltà.

Codice: Seleziona tutto

<?php

$up_path = "upload";

echo '<html>
        <title>Upload file</title>
        <body>';

function num_upload() {
        echo '<form action="upload.php" method="post">
                How many images do you want to upload?
                <input type="text" name="num">
                <input type="submit" value="Submit">
                </form>';
}

function multi_upload($num) {
        echo '<form action="upload.php" enctype="multipart/form-data" method="post">
                <table border="0" width="400" cellspacing="0" cellpadding="0" align=center>';
        for ($i = 1; $i <= $num; $i++) {
                echo '<tr><td>'."Image ".$i.": ".'</td>
                        <td><input type="file" name="image[]"></td></tr>
                        <tr><td>'."Desc. ".'</td>
                        <td><input type="text" name="desc[]"></td></tr>';
        }
        echo '<tr><td colspan=2 align=center>
                <input type=submit value="Add Image(s)"></td></tr>
                </table></form>';
}

function upload($up_path) {
        $j = 1;
        while (list($key,$value) = each($_FILES['image']['name'])) {
                print "1\n";
                //list($desc_k,$desc_v) = each($_REQUEST['desc']['name']);
                echo "2\n";
                if (! empty($value)) {
                        echo $value."\n";
                        $filename = $value;
                        $filename = str_replace(" ","_",$filename);
                        $filename = str_replace("'","",$filename);
                        echo $filename."\n";
                        $path = $up_path."/".$filename;
                        if (file_exists($path)) {
                                echo "The file ".$filename." already exists.\n";
                                break;
                        }
                        echo $path."\n";
                        if (copy($_FILES['image']['tmp_name'][$key],$path))
                                echo "File ".$j." caricato\n";
                        else {
                                echo "Errore nella copia";
                        }
                        if (chmod($path,0660))
                                echo "File ".$j." chmod'd\n";
                        if (! empty($desc[$j])) {
                                $desc_file = fopen("$path/.pics_desc","a");
                                $imgdesc = $desc_v;
                                $imgdesc = str_replace("\n"," ",$imgdesc);
                                $write = $filename.";".$desc_v."\n";
                                fwrite($desc_file,$write);
                                fclose();
                        }
                        $j++;
                }
        }
}

num_upload();
if (! empty($_REQUEST['num'])) {
        echo'<br /><p>';
        multi_upload($_REQUEST['num']);
        echo '</p>';
}
if (! empty($_FILES['image'])) {
        $up_path = "upload";
        echo $_FILES['image']."\n";
        echo '<br /><p>';
        upload($up_path);
        echo '</p>';
}
echo '</body></html>';
?>

1) Perché quando uso "\n" con echo, non va a capo?
2) Per ché dentro la funzione "upload()" non posso usare la variabile "$up_path" che ho dichiarato inizialmente?
3) Perché non funziona, dicendomi "PHP Warning: copy() [<a href='function.copy'>function.copy</a>]: Filename cannot be empty in /var/www/htdocs/upload.php on line 49, referer: http://192.168.7.4/upload.php" (preso dal log di apache)? In pratica è come se nella "copy()" la variabile "$path" (che uso come path di destinazione, comprensivo del nome file) fosse vuota; peccato che la faccio stampare la riga prima e sono sicuro che ha il valore giusto :roll: .

Re: Uploader php

Inviato: mar giu 15, 2010 11:38
da j0kers
Scusa dove non ti funziona lo "\n" qui:

Codice: Seleziona tutto

                print "1\n";
                //list($desc_k,$desc_v) = each($_REQUEST['desc']['name']);
                echo "2\n";


o qui

Codice: Seleziona tutto

 echo $filename."\n";

Per la seconda prova a modificare in questo modo:

Codice: Seleziona tutto

 echo $filename , "\n";


Per quanto riguarda la variabile prova in questo modo:

Codice: Seleziona tutto

$up_path = upload;

Senza apici, per il resto attendiamo pareri di esperti 8)

Re: Uploader php

Inviato: mar giu 15, 2010 11:43
da conraid
@jokers, non sono esperto, ma... cancella il post è meglio ;-)
- o usi il punto o la virgola per unire le stringhe, non entrambi
- se non metti tra apici o virgolette una stringhe per il sistema è altro (una costante in questo caso) e darà errore o un warning dicendo che prenderà il valore upload come costante (ma non è quello che vuole ansa)

@ansa

1) gli a capo sono <br> in html
2) come non puoi usarla? in che senso? se intendi usarla senza metterla tra le variabili passate alla funzione, allora "globalizzala"
3) esiste la directory upload dentro il path in cui gira lo script?

Re: Uploader php

Inviato: mar giu 15, 2010 11:49
da Ansa89
L'errore del "\n" me lo dà ovunque indistintamente.
Se provo a cambiare in

Codice: Seleziona tutto

echo $filename. , "\n";

Mi dà errore sulla virgola e si blocca.

Se uso "$up_path = upload;" senza apici o virgolette, non me lo prende e quando vado a stampare il valore di "$path" ottengo "/image.jpg" invece di "upload/image.jpg", quindi non va bene neanche quello.

Re: Uploader php

Inviato: mar giu 15, 2010 11:52
da j0kers
Mi da questo errore:

Codice: Seleziona tutto

Warning: copy(upload/481698140.jpg) [function.copy]: failed to open stream: No such file or directory

la directory upload non esiste. comunque usa $up_path = 'upload';

Re: Uploader php

Inviato: mar giu 15, 2010 11:56
da Ansa89
conraid ha scritto:1) gli a capo sono <br> in html
2) come non puoi usarla? in che senso? se intendi usarla senza metterla tra le variabili passate alla funzione, allora "globalizzala"
3) esiste la directory upload dentro il path in cui gira lo script?

1) Ma come faccia a mettere un "a capo" dentro un file?
Come faccio a modificare un "a capo" della descrizione con uno spazio?

2) Proverò a metterla globale.

3) La directory esiste e ha i permessi giusti, il problema è che la funzione "copy()" dice che la destinazione (cioè il secondo parametro) è vuoto :? .

Re: Uploader php

Inviato: mar giu 15, 2010 12:08
da j0kers
Immagine

Uploaded with ImageShack.us

Re: Uploader php

Inviato: mar giu 15, 2010 12:11
da Ansa89
Prova a caricare un file con degli spazi.

Re: Uploader php

Inviato: mar giu 15, 2010 12:15
da j0kers
Immagine

Uploaded with ImageShack.us
Ho dotuto creare la directory upload manualmente altrimenti non funzionava.

Re: Uploader php

Inviato: mar giu 15, 2010 12:31
da Ansa89
j0kers ha scritto:Ho dotuto creare la directory upload manualmente altrimenti non funzionava.

Quello è normale.

Prova a caricare dei file "grossi" (intorno ai 10MB).

Re: Uploader php

Inviato: mar giu 15, 2010 12:33
da Paoletta
ciao ansa89, per il primo dei problemi devi lasciar perdere "\n" ed usare "<br />" al suo posto; infatti per visualizzare l'output del programma stai usando un browser e questi capiscono solo il codice html; per cui "a capo" è "<br />". Se invece tu avessi scritto il testo di una mail e poi l'avessi inviato con il comando mail() di php, allora per andare a capo dovresti usare "\n" (a meno di non voler usare codice html anche per il testo della mail); per gli altri problemi ora guardo

Re: Uploader php

Inviato: mar giu 15, 2010 12:38
da targzeta
In realtà il codice è HTML e quindi "a capo" si traduce con "<BR>", il "\n" funziona uguale ma vale per il sorgente del file generato (prova a visualizzare il sorgente della pagina).

2) Si chiama "scope delle variabili" hai una variabile esterna alla funzione che si chiama $up_path e un parametro della funzione con lo stesso nome, la funzione ovviamente vede il parametro.

3) Quando passia via GET o POST dei nomi dei file o dei path in generale ti conviene sempre codificarli e poi decodificarli, quello che ho notato io è che spesso i parametri vengono modificati (ad esempio ' ' viene sostituito da '_' se non ricordo male).

Emanuele

Re: Uploader php

Inviato: mar giu 15, 2010 12:43
da j0kers
Con file grossi (11MB) mi ritorna alla posizione iniziale senza nessun messaggio e nessuna copia in upload

Re: Uploader php

Inviato: mar giu 15, 2010 12:47
da targzeta
4) C'è un limite alla dimensione dei file che puoi caricare. Guarda il file php.ini e cerca qualcosa come "post_max_size" o "upload_max_filesize"

Emanuele

:edit: Vedi qui per capire meglio la differenza.

Re: Uploader php

Inviato: mar giu 15, 2010 12:57
da j0kers
4) C'è un limite alla dimensione dei file che puoi caricare. Guarda il file php.ini e cerca qualcosa come "post_max_size" o "upload_max_filesize"

50M