Προς το περιεχόμενο

File uploading μέσω php


Lucky Luke

Προτεινόμενες αναρτήσεις

Δημοσ.

Προσπαθώντας να κάνω δοκιμές με file uploading μέσω php σε ένα apache server (σε Windows XP) που έχω στο localhost διαπίστωσα το παρακάτω.

 

Κάνω χρήση της move_uploaded_file() για να μετακινήσω το temp αρχείο από το temp directory σε μία περιοχή που επιθμώ. Το θέμα είναι ότι ενώ έxω θέσει στο php.ini το directive

>upload_tmp_dir = "C:\TEMP"

βλέπω ότι το temp uploaded αρχείο αποθηκεύεται στον ίδιο φάκελο που τρέχει το .php αρχείο και όταν καλείται η move_uploaded_file() δε γίνεται μετακίνηση αλλά αντιγραφή στο directory που του θέτω στη συνάρτηση, δηλαδή το αρχικό temp αρχείο δε σβήνεται. Είναι λογικό αυτό;

 

Επίσης αλλάζω από το php.ini το "upload_tmp_dir" και επανεκκινώ τον apache αλλά δε φαίνεται να αλλάζει κάτι. Μήπως πρέπει να επανεκκινήσω διαφορετικά την php για να διαβάσει τις νέες ρυθμίσεις;

Δημοσ.

H move_uploaded_file() κάνει copy/paste ένα αρχείο.

 

Μπορείς να της περάσεις σαν παράμετρο που θες να σώζεις τα αρχεία σου

 

Ε;

 

Η move_uploaded_file() κάνει αυτό που λέει το όνομά της: move ένα αρχείο.

 

Επίσης, δεν μπορείς αλλά πρέπει να δώσεις το destination directory.

 

Προσπαθώντας να κάνω δοκιμές με file uploading μέσω php σε ένα apache server (σε Windows XP) που έχω στο localhost διαπίστωσα το παρακάτω.

 

Κάνω χρήση της move_uploaded_file() για να μετακινήσω το temp αρχείο από το temp directory σε μία περιοχή που επιθμώ. Το θέμα είναι ότι ενώ έxω θέσει στο php.ini το directive

>upload_tmp_dir = "C:\TEMP"

βλέπω ότι το temp uploaded αρχείο αποθηκεύεται στον ίδιο φάκελο που τρέχει το .php αρχείο και όταν καλείται η move_uploaded_file() δε γίνεται μετακίνηση αλλά αντιγραφή στο directory που του θέτω στη συνάρτηση, δηλαδή το αρχικό temp αρχείο δε σβήνεται. Είναι λογικό αυτό;

 

Επίσης αλλάζω από το php.ini το "upload_tmp_dir" και επανεκκινώ τον apache αλλά δε φαίνεται να αλλάζει κάτι. Μήπως πρέπει να επανεκκινήσω διαφορετικά την php για να διαβάσει τις νέες ρυθμίσεις;

 

Όταν κάνεις αλλαγές στο php.ini στη συνέχεια χρειάζεται restart του web server -- τίποτα παραπάνω και τίποτα λιγότερο.

 

Έχε υπόψη ότι μπορεί (δε μας λες πώς εγκατέστησες Apache/PHP οπότε δε μπορώ να είμαι σίγουρος) να έχεις πολλαπλά php.ini στο σύστημα, από τα οποία μόνο ένα είναι το "σωστό".

 

Τσέκαρε αν όντως αλλάζεις το σωστό και αν οι αλλαγές σου πιάνουν τόπο κάνοντας κάτι τέτοιο:

 

>echo ini_get('upload_tmp_dir');

 

(δοκίμασε για σιγουριά και κάποιο άλλης μορφής setting, όπως π.χ. το memory_limit ή το max_execution_time)

Δημοσ.

Δηλαδή εάν χρησιμοποιήσω την move_uploaded_file() για ένα αρχείο, δεν θα το κάνει copy στο path που θα έχω ορίσει;;

 

Εάν εσύ θε να το λες Move ας το λέμε move.....

Δημοσ.

Πιστεύω ότι η διαφορά του move από το copy είναι εύκολα κατανοητή σε όλους.

 

Εγώ προσωπικά δεν έχω θέμα πώς να το λέμε, γι' αυτό χρησιμοποιώ τις λέξεις όπως τις ορίζει και το λεξικό.

Δημοσ.

Παιδιά, κατ' αρχάς ευχαριστώ για τις απαντήσεις.

 

Απαντάω ένα ένα τα ερωτήματα.

1. Στην move_uploaded_file() δίνω κανονικά όρισμα. Εκεί αντιγράφεται το αρχείο που επιθυμώ αλλά το θέμα είναι ότι το "πρωτότυπο" δε σβήνεται, γι' αυτό και έκανα το διαχωρισμό του move από το copy.

2. Η εγκατάσταση Apache/PHP έγινε ξεχωριστά με εκτελέσιμα αρχεία (exe ή msi, δε θυμάμαι), δηλαδή δε χρησιμοποίησα κάποιο all-in-one πακέτο, όπως το wamp.

3. Απ' όσο έχω δει πολλαπλά ini files δεν υπάρχουν (η τουλάχιστον εγώ χρησιμοποιώ το σωστό), κάτι το οποίο το συμπεραίνω από δύο πράγματα: α. επεξεργάζομαι το αρχείο που αναφέρεται και στις πληροφορίες της phpinfo(), β. οι αλλαγές που έκανα στο temp_dir και στα άλλα settings που μου είπες εφαρμόστηκαν (τουλάχιστον σύμφωνα με τα echo που έτρεξα) όταν επανεκκίνησα τον apache. Δυστυχώς όμως δεν άλλαξε κάτι από πριν.

 

Η όλη συμπεριφορά μήπως έχει να κάνει με το γεγονός ότι ο server τρέχει σε Windows XP κι όχι σε κάποιο unix-based;

Δημοσ.

Δηλαδή ενώ παίρνει το setting δεν το χρησιμοποιεί έτσι;

 

Σκεφτόμουν μήπως είναι κάποιο permissions issue, αλλά αφού τρέχεις σε XP χλωμό. Παρόλα αυτά μπορείς να κάνεις λίγο debugging ως εξής:

 

Από task manager (ή ακόμα καλύτερα Process Explorer) ή άλλο αντίστοιχο πρόγραμμα, δες ως τι user τρέχει ο apache. Στη συνέχεια τσέκαρε αν αυτός ο χρήστης έχει read+write permissions στο c:\temp -- αν δεν έχει, βρήκες το πρόβλημα.

 

Επίσης δοκίμασε να βάλεις c:/temp (δε νομίζω να υπάρχει θέμα του στυλ περνάει το backslash για escape character, αλλά καλύτερα σιγουριά παρά δε νομίζω).

Δημοσ.

Εντέλει γίνεται copy ή όχι του αρχείου με την move_uploaded_file();

 

Απλή ερώτηση κάνω και μία απλή απάντηση περιμένω... ( Ναι ή Όχι;;;; )

Δημοσ.

Εντέλει γίνεται copy ή όχι του αρχείου με την move_uploaded_file();

 

Απλή ερώτηση κάνω και μία απλή απάντηση περιμένω... ( Ναι ή Όχι;;;; )

 

Όχι. Γίνεται move.

 

Σε περίπτωση που σκοπεύεις να κάνεις κι άλλες απλές ερωτήσεις, ορίστε προκαταβολικά και η επόμενη απάντηση:

 

Η προφανής διαφορά του copy με το move είναι ότι στην πρώτη περίπτωση το αρχείο εξακολουθεί να υπάρχει στην αρχική του τοποθεσία, ενώ στη δεύτερη όχι. Αυτό μπορεί να έχει συνέπειες για την ασφάλεια του συστήματος, για τον ελεύθερο χώρο στο δίσκο σου και για τη σωματική σου υγεία αν χτυπάς το κεφάλι σου στην οθόνη όταν καμιά φορά κάνεις move κατα λάθος και δε μπορείς να καταλάβεις που πήγε το τάδε αρχείο.

 

Η όχι τόσο προφανής διαφορά είναι ότι όλα τα σύγχρονα filesystems διατηρούν και διαφόρων ειδών metadata για κάθε αρχείο, που κυμαίνονται από εντελώς πληροφοριακά (last access time) μέχρι εντελώς σημαντικά (access control lists). Κάποια από τα metadata αυτά παραμένουν αναλλοίωτα όταν ένα αρχείο γίνει move, ενώ παίρνουν νέες (διαφορετικές) τιμές όταν γίνει copy. Αυτό μπορεί να έχει συνέπειες όχι μόνο για την ασφάλεια αλλά ακόμα και για τη σωστή λειτουργία του συστήματος.

Δημοσ.

Με όλη την καλή διάθεση γιατί έχω μπερδευτεί.

 

Έστω όχι έχω μία php σε έναν X server και κάνω move_uploaded_file() ένα αρχείο από τον σκληρό μου δίσκο στον server πάνω.

 

Θα χαθεί το αρχείο στον σκληρό μου δίσκο;

Δημοσ.

Με όλη την καλή διάθεση γιατί έχω μπερδευτεί.

 

Έστω όχι έχω μία php σε έναν X server και κάνω move_uploaded_file() ένα αρχείο από τον σκληρό μου δίσκο στον server πάνω.

 

Θα χαθεί το αρχείο στον σκληρό μου δίσκο;

 

move_uploaded_file() δεν κάνεις από το δικό σου υπολογιστή στον server. Το αρχείο πάει στο server μέσω HTTP. Η move_uploaded_file() έρχεται στο προσκήνιο αφότου το αρχείο έχει ήδη αντιγραφεί στον server.

Δημοσ.

Δηλαδή ενώ παίρνει το setting δεν το χρησιμοποιεί έτσι;

 

Σκεφτόμουν μήπως είναι κάποιο permissions issue, αλλά αφού τρέχεις σε XP χλωμό. Παρόλα αυτά μπορείς να κάνεις λίγο debugging ως εξής:

 

Από task manager (ή ακόμα καλύτερα Process Explorer) ή άλλο αντίστοιχο πρόγραμμα, δες ως τι user τρέχει ο apache. Στη συνέχεια τσέκαρε αν αυτός ο χρήστης έχει read+write permissions στο c:\temp -- αν δεν έχει, βρήκες το πρόβλημα.

 

Επίσης δοκίμασε να βάλεις c:/temp (δε νομίζω να υπάρχει θέμα του στυλ περνάει το backslash για escape character, αλλά καλύτερα σιγουριά παρά δε νομίζω).

Ο apache (httpd.exe, αυτό βρήκα) τρέχει ως System και έλεγξα και τα δικαιώματα του C:\TEMP και έχει Full Control.

Άλλαξα τη ρύθμιση και σε "c:/TEMP" και σε "c:\\TEMP (αν και η αρχική επιλογή που αναφέρω με το \ έπρεπε να δουλεύει γιατί αυτό τον τρόπο χρησιμοποιεί και σε άλλα ήδη έτοιμα directives που χρησιμοποιεί) και πάλι τίποτα...

 

 

move_uploaded_file() δεν κάνεις από το δικό σου υπολογιστή στον server. Το αρχείο πάει στο server μέσω HTTP. Η move_uploaded_file() έρχεται στο προσκήνιο αφότου το αρχείο έχει ήδη αντιγραφεί στον server.

Για να συμπληρώσω το παραπάνω, το αρχείο ανεβαίνει στον server πατώντας το submit στη φόρμα. Στην πραγματικότητα δημιουργείται ένα αντίγραφό του και ανεβαίνει. Το θέμα είναι ότι η "ζωή" αυτού του αρχείου (πάνω στον server) είναι όσο και η διάρκεια εκτέλεσης του script. Όταν το script τερματίσει διαγράφεται μαζί και το αρχείο αυτό (είναι δηλαδή τελείως προσωρινό από την πλευρά του server) και αυτό γίνεται για λόγους οικονομίας και ασφάλειας των δεδομένων στον server. Γι' αυτό για να το διατηρήσουμε το μετακινούμε σε κάποιο άλλο directory (εδώ έρχεται η χρήση της move_uploaded-file()) ή το μετονομάζουμε προτού τερματίσει το script.

Δημοσ.

move_uploaded_file() δεν κάνεις από το δικό σου υπολογιστή στον server. Το αρχείο πάει στο server μέσω HTTP. Η move_uploaded_file() έρχεται στο προσκήνιο αφότου το αρχείο έχει ήδη αντιγραφεί στον server.

Μισό γιατί σε χάνω,

 

έχω μία σελίδα την index.php, όπου είναι μία φόρμα και εκεί έχω δηλώσει ποιo αρχείο από τον σκληρό μου δίσκο θέλω(ας πούμε ένα txt). Όταν πατάω submit πάω στην upload.php και μέσα σε αυτή την PHP κάνω move_uploaded_file() το αρχείο που έχω επιλέξει από την index.php.

>
move_uploaded_file($_FILES["file"]["tmp_name"],"upload_files/file.txt");

 

Αυτό το αρχείο δεν θα γίνει copy από τον σκληρό μου δίσκο στον server πάνω στον φάκελο upload_files με ονομασία file.txt;

Δηλαδή θα μεταφερθεί από τον σκληρό μου στον server πάνω αλλά θα υπάρχει και στον σκληρό μου αλλά και στον server πάνω.

 

Σωστά;

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...