Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
nikos-manias
Δημοσιεύσεις: 38
Εγγραφή: 15 Ιαν 2010 10:13

Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Δημοσίευση από nikos-manias » 21 Μάιος 2010 17:35

Καλησπέρα σε όλους!

Έχω ένα script το οποίο ανοίγει ένα αρχείο και το στέλνει στον browser του χρήστη.
Παρακάτω παραθέτω τον αντίστοιχο κώδικα.

Κώδικας: Επιλογή όλων

$known_mime_types=array(
			"pdf" => "application/pdf",
			"txt" => "text/plain",
			"html" => "text/html",
			"htm" => "text/html",
			"html" => "text/html",
			"exe" => "application/octet-stream",
			"zip" => "application/zip",
			"doc" => "application/msword",
			"xls" => "application/vnd.ms-excel",
			"ppt" => "application/vnd.ms-powerpoint",
			"gif" => "image/gif",
			"png" => "image/png",
			"jpeg"=> "image/jpg",
			"jpg" =>  "image/jpg",
			"php" => "text/plain"
 		);		

                        $file_extension = strtolower(substr(strrchr($filename,"."),1));
			if(array_key_exists($file_extension, $known_mime_types))
			{
				$mime_type=$known_mime_types[$file_extension];
			}
			else 
			{
				$mime_type="application/force-download";
			};

                       // stream the file and exit the script when complete
			set_time_limit(0);
			fpassthru($file);
			exit;

Σε γενικές γραμμές δουλεύει μια χαρά.
Να σημειώσω ότι το αρχείο το έχω ονομάσει filemanager.php.
Επίσης, τα αρχεία που δίνει η σελίδα στους χρήστες είναι .exe .
Όμως μερικοί χρήστες της σελίδας μου παθαίνουν το εξής:
Αντί να κατεβεί το αρχείο που πρέπει ,κατεβαίνει ένα αρχείο με όνομα filemanager και το οποίο έχει μέγεθος μερικές φορές όσο είναι το μέγεθος του κανονικού αρχείου (~60ΜΒ) που θα έπρεπε κανονικά να έχει κατεβεί και μερικές φορές αρκετά μικρότερο (~ 10ΜΒ)
Φυσικά το αρχείο αυτό δεν ανοίγει καθώς δεν αναγνωρίζεται από τα windows (δεν έχει κατάληξη)

Έχει αντιμετωπίσει ποτέ κανείς κάτι παρόμοιο;
Ποιος ο λόγος να αλλάζει το όνομα του αρχείου;
Το έχω δοκιμάσει και εγώ ο ίδιος με όλους τους browsers.
Να τονίσω ότι όλοι οι χρήστες που το έχουν παρατηρήσει αυτό χρησιμοποιούν IE (αλλα δεν γνωρίζω αν είναι κάποια συγκεκριμένη έκδοση και ποια...)

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Δημοσίευση από nbc » 21 Μάιος 2010 19:12

Κανονικά, με τον κώδικα που παραθέτεις, δεν θα έπρεπε να δουλεύει πουθενά.

Δες στο Example #1, τα headers. Από αυτά, χρειάζεσαι οπωσδήποτε το content-type και το content-disposition. Στην περίπτωση της passthru χρειάζεσαι και το content-length (η readfile το βάζει μόνη της).

Γενικά, είναι προτιμότερη η χρήση της readfile για τη δουλειά αυτή. Αν επιμένεις στη passthru, φρόντισε το $file να το ανοίγεις ως binary και ο file-pointer να είναι reset.

nikos-manias
Δημοσιεύσεις: 38
Εγγραφή: 15 Ιαν 2010 10:13

Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Δημοσίευση από nikos-manias » 21 Μάιος 2010 19:18

Ορίζω και τα headers κανονικα.
Απλά παρέλειψα να τα βάλω.

Τα γράφω τώρα.

Κώδικας: Επιλογή όλων

$size = filesize($filename);
			header('Content-Type: '.$mime_type);
			header('Content-Length: '.$size);
			header('Content-Disposition: attachment; filename='.$filename);
			header('Content-Transfer-Encoding: binary');
			
			// open the file in binary read-only mode
			// display the error messages if the file can΄t be opened
			$file = @ fopen($filename, 'rb');
Το αρχείο παντως δουλευει κανονικα σε εμένα και στους υπόλοιπους στη δουλειά μου, όπως και στους περισσότερους χρηστες.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Δημοσίευση από nbc » 21 Μάιος 2010 20:02

ok, αυτοί οι headers είναι εντάξει για τους εντάξει αλλά όπως οι πάντες γνωρίζουν ο IE γράφει τη δική του ιστορία...

Ξεκινάς με cache control (υπάρχει στο link που σου έδωσα). Ο IE το χρειάζεται παντού και πάντα. Βάλε όλους τους δυνατούς τύπους που υπάρχουν ώστε ο IE να μην cacheάρει το download.

Από εκεί και πέρα, έχω διαβάσει πως ο IE μπερδεύεται (στο download) όταν το content είναι compressed (με mod_gzip ή php compression), που σημαίνει ότι αν χρησιμοποιείς πρέπει να το βγάλεις προσωρινά εκτός. Δεν έχω ιδία άποψη επί του συγκεκριμένου tip καθώς δεν χρησιμοποιώ compression. Για το cache control είμαι βεβαιότατος.

nikos-manias
Δημοσιεύσεις: 38
Εγγραφή: 15 Ιαν 2010 10:13

Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Δημοσίευση από nikos-manias » 22 Μάιος 2010 11:25

Θα εφαρμόσω λοιπόν τα παρακατω headers και θα δώ εάν διαμαρτυρηθει ξανά καποιος χρήστης.

Κώδικας: Επιλογή όλων

set_time_limit(0);
				header('Content-Description: File Transfer');
				header('Content-Type: '.$mime_type);
				header('Content-Disposition: attachment; filename='.$filename);
				header('Content-Transfer-Encoding: binary');
				header('Expires: 0');
				header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
				header('Pragma: public');
				header('Content-Length: '.$size);
				ob_clean();
				flush();
				readfile($filename);					
				exit;
Σε ευχαριστώ πολύ nbc.

nikos-manias
Δημοσιεύσεις: 38
Εγγραφή: 15 Ιαν 2010 10:13

Παραξενη συμπεριφορά κατα την αποστολή αρχείου

Δημοσίευση από nikos-manias » 26 Ιούλ 2010 12:39

Γειά και πάλι...
Τελικά το πρόβλημα ξαναεμφανίστηκε σε καποιους χρήστες....
Δλδ αντί για το αρχείο που πρέπει να εμφανιστεί εμφανίζετε το filemanager.php
που ειναι το όνομα του script που στελνει το αρχείο.
Να σημειώσω ότι τα αρχεία είναι εκτελέσιμα (.exe) !

Παρατήρησα όμως ότι αν αλλάξει ο χρήστης την κατάληξη σε .exe τότε το πρόγραμμα εγκαθίσταται κανονικα.

Μήπως τώρα εντοπίζει κάποιος την αιτία του κακού;


Ευχαριστω!

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: ss13 και 1 επισκέπτης