download αρχείο αλλαγή μεγέθους

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

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

Απάντηση
abeautifulmind
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2010 18:04

download αρχείο αλλαγή μεγέθους

Δημοσίευση από abeautifulmind » 02 Απρ 2011 20:21

καλησπέρα παιδιά.
έχω αυτόν τον κώδικα για download αρχείων

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

function download_file() {
    //Check for download request:
    if(isset($_GET['file'])) {
        //Make sure there is a file before doing anything
        if(is_file($this->path . basename($_GET['file']))) {
            //Below required for IE:
            if(ini_get('zlib.output_compression')) {
                ini_set('zlib.output_compression', 'Off');
            }

            //Set Headers:
            header('Pragma: public');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($this->path . basename($_GET['file']))) . ' GMT');
            header('Content-Type: application/force-download');
            header('Content-Disposition: inline; filename="' . basename($_GET['file']) . '"');
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: ' . filesize($this->path . basename($_GET['file'])));
            header('Connection: close');
            readfile($this->path . basename($_GET['file']));
            exit();
        }
        else {
            $this->show_notification('File not found!', 'error');
        }
    }
}
και ενώ όταν κάνω upload το αρχείο στον server όλα καλά (το ανοiγω το αρχείο με προβολή από τον φάκελο που έχω τα dowloads στον server και ανοίγει κανονικά) όταν το κάνω download με στο script δεν το ανοίγει και το μέγεθος του είναι μεγαλύτερο από το original αρχείο.
Καμία ιδέα?

Άβαταρ μέλους
Pavel
Honorary Member
Δημοσιεύσεις: 1046
Εγγραφή: 08 Αύγ 2003 00:05
Τοποθεσία: UK

download αρχείο αλλαγή μεγέθους

Δημοσίευση από Pavel » 02 Απρ 2011 20:47

1. Ανέβασε ένα έγγραφο κειμένου.
2. Κατέβασέ το.
3. Σύγκρινε τα 2 αρχεία, να δεις τι παραπάνω πληροφορίες κατεβαίνουν. Μπορεί να είναι κάποιο notice ή warning
Εσύ είσαι τρελός.

abeautifulmind
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2010 18:04

download αρχείο αλλαγή μεγέθους

Δημοσίευση από abeautifulmind » 03 Απρ 2011 11:32

Όταν πατάω download το αρχείο με firefox βγάζει επιλέξατε να ανοίξετε το αρχείο image.jpg που είναι adobe acrobat 7 αρχείο.
Γιατί κάτι δεν γίνεται καλά με το file transfer στα headers? στον κώδικα?
Α και κάτι ακόμα δεν ανεβάζει αρχεία pdf μου λέει δεν υποστηρίζοναται.
ο κώδικας όλος.

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

<?php

class Upload &#123;

    //Folder Variables&#58;
	protected $path = 'uploads/';

	//File Max Size&#58;
	protected $max_file_size = 1;

    //Extension Types&#58;
	protected $extensions = array&#40;'image/jpg', 'image/jpeg', 'image/png', 'plain/txt', 'application/pdf','application/excel'&#41;;

    public function upload_file&#40;&#41; &#123;
        //Check for upload request&#58;
        if&#40;isset&#40;$_FILES&#91;'file'&#93;&#41;&#41; &#123;
            //Set File Information&#58;
            $file = array&#40;
                'name' => $_FILES&#91;'file'&#93;&#91;'name'&#93;,
                'type' => $_FILES&#91;'file'&#93;&#91;'type'&#93;,
                'size' => $_FILES&#91;'file'&#93;&#91;'size'&#93;,
                'temp' => $_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;,
                'error' => $_FILES&#91;'file'&#93;&#91;'error'&#93;
            &#41;;

            //Check for file error&#58;
            if&#40;$file&#91;'error'&#93; == 0&#41; &#123;
                foreach&#40;$this->extensions as $extension&#41; &#123;
                    if&#40;$extension == $file&#91;'type'&#93;&#41; &#123;
                        //Filetype ok!
                        $filetype_ok = true;
                    &#125;
                &#125;

                //No match but no error&#58;
                if&#40;!isset&#40;$filetype_ok&#41;&#41; &#123;
                    $filetype_ok = false;
                &#125;
            &#125;
            else &#123;
                //Filetype/error okay?&#58;
                $filetype_ok = false;
            &#125;

            //Is Filetype ok?
            if&#40;$filetype_ok&#41; &#123;
                //Check if it is under the max size limit
                if&#40;$file&#91;'size'&#93; < &#40;$this->max_file_size * 1048576&#41;&#41; &#123;
                    //Filename&#58;
                    $filename = mt_rand&#40;0, 5000&#41; . '_' . $file&#91;'name'&#93;;

                    //Now lets more the file&#58;
                    $move_file = move_uploaded_file&#40;$file&#91;'temp'&#93;, $this->path . $filename . '.'&#41;;

                    if&#40;$move_file&#41; &#123;
                        //File uploaded&#58;
                        $this->show_notification&#40;'Το ανέβασμα του αρχείου ήταν επιτυχές!','success'&#41;;
						$_SESSION&#91;'file'&#93;="$filename";
						$file_id_set=1;
						$_SESSION&#91;'file_id_set'&#93;="$file_id_set";
						
                    &#125;
                &#125;
                else &#123;
                    $this->show_notification&#40;'Πολύ μεγάλο αρχείο δοκιμάστε ξανά.','error'&#41;;
                &#125;
            &#125;
            else &#123;
                $this->show_notification&#40;'Ο τύπος του αρχείου δεν υποστηρίζεται!','error'&#41;;
            &#125;
        &#125;
    &#125;

function download_file&#40;&#41; &#123;
    //Check for download request&#58;
    if&#40;isset&#40;$_GET&#91;'file'&#93;&#41;&#41; &#123;
        //Make sure there is a file before doing anything
        if&#40;is_file&#40;$this->path . basename&#40;$_GET&#91;'file'&#93;&#41;&#41;&#41; &#123;
            //Below required for IE&#58;
            if&#40;ini_get&#40;'zlib.output_compression'&#41;&#41; &#123;
                ini_set&#40;'zlib.output_compression', 'Off'&#41;;
            &#125;

            //Set Headers&#58;
            header&#40;'Pragma&#58; public'&#41;;
            header&#40;'Expires&#58; 0'&#41;;
            header&#40;'Cache-Control&#58; must-revalidate, post-check=0, pre-check=0'&#41;;
            header&#40;'Last-Modified&#58; ' . gmdate&#40;'D, d M Y H&#58;i&#58;s', filemtime&#40;$this->path . basename&#40;$_GET&#91;'file'&#93;&#41;&#41;&#41; . ' GMT'&#41;;
            header&#40;'Content-Type&#58; application/force-download'&#41;;
            header&#40;'Content-Disposition&#58; inline; filename="' . basename&#40;$_GET&#91;'file'&#93;&#41; . '"'&#41;;
            header&#40;'Content-Transfer-Encoding&#58; binary'&#41;;
            header&#40;'Content-Length&#58; ' . filesize&#40;$this->path . basename&#40;$_GET&#91;'file'&#93;&#41;&#41;&#41;;
            header&#40;'Connection&#58; close'&#41;;
            readfile&#40;$this->path . basename&#40;$_GET&#91;'file'&#93;&#41;&#41;;
            exit&#40;&#41;;
        &#125;
        else &#123;
            $this->show_notification&#40;'File not found!', 'error'&#41;;
        &#125;
    &#125;
&#125;

    public function show_notification&#40;$items, $type&#41; &#123;
		echo "<ul class='$type'> \n";
			if&#40;count&#40;$items&#41; > 1&#41; &#123;
				foreach&#40;$items as $item&#41; &#123;
					echo "<li>$item</li> \n";
				&#125;
			&#125;
			else &#123;
				echo "<li>$items</li> \n";
			&#125;
		echo "</ul> \n";
	&#125;

&#125;

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

download αρχείο αλλαγή μεγέθους

Δημοσίευση από nbc » 03 Απρ 2011 14:57

Οι headers σου είναι - με το συμπάθειο - κιμάς. Ο ένας αναιρεί τον προηγούμενο. Αυτό μου λέει πως έχει πέσει τυφλό copy-paste χωρίς να κατανοείς τι κάνεις, και ότι κάτσει. Να που δεν κάθεται, όμως...
  • Με το "Pragma: public" δηλώνεις cache-able resource, το οποίο εν συνεχεία ακυρώνεις με το "Expires" και το "Cache-control".
  • Με το "Content-Disposition:" δηλώνεις inline content, το οποίο όμως ακυρώνεις με το "application/force-download"
  • Προσπαθείς να ελέγξεις το transfer-encoding και το μέγεθος του content, και καλά ελέγχοντας το zlib.output_compression, πλην όμως μετά τη readfile ο έλεγχος περνάει στον web server - ας πούμε Apache - ο οποίος μπορεί κάλιστα να το συμπιέσει (πχ mod_deflate) και να το στείλει chunked ακυρώνοντας τους header σου που λένε το αντίθετο.
Με άλλα λόγια, δε μου φαίνεται διόλου περίεργο που δεν σου δουλεύει. Αποφάσισε τι θέλεις να κάνεις και χρησιμοποίησε τους κατάλληλους headers.

Αν το pdf σου το θέλεις inline (εφόσον υπάρχει αυτή η δυνατότητα στον client), τότε χρειάζεσαι ΟΠΩΣΔΗΠΟΤΕ το κατάλληλο content-type:

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

    header&#40;'Content-type&#58; application/pdf'&#41;;
    header&#40;'Content-Disposition&#58; inline; filename="my.pdf"'&#41;;
Αν το θέλεις downloadable:

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

    header&#40;'Content-type&#58; 'application/x-download'&#41;;
    header&#40;'Content-Disposition&#58; attachment; filename="my.pdf"'&#41;;
Αν ΔΕΝ θέλεις cache

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

    header&#40;'Pragma&#58; no-cache'&#41;;
    header&#40;'Cache-Control&#58; max-age=0, no-store, no-cache, must-revalidate'&#41;;
    header&#40;'Cache-Control&#58; post-check=0, pre-check=0', FALSE&#41;;
...και βάζεις τα "Expires:" και "Last-modified:" στο παρόν.

Αν θέλεις cache, τότε απλά δεν χρησιμοποιείς τους παραπάνω Headers και ρυθμίζεις το Expires στο μέλλον. Αυτό όμως σημαίνει πως η εφαρμογή σου θα πρέπει να μπορεί να χειριστεί requests με "If-Modified-Since" header και ETags, πράγμα που δεν το βλέπω καθώς είναι προχωρημένο topic. Άρα, ή βγάλε cache ή άσε τον web server να σερβίρει τα αρχεία σου.

Τέλος, ξεχνάς τους "Content-Transfer-Encoding" και "Content-Length" headers, καθώς δεν τους ελέγχεις. Θα συμπληρωθούν αυτόματα όπως πρέπει.

abeautifulmind
Δημοσιεύσεις: 319
Εγγραφή: 02 Μάιος 2010 18:04

download αρχείο αλλαγή μεγέθους

Δημοσίευση από abeautifulmind » 03 Απρ 2011 15:33

Παλι δεν γίνεται τίποτα.
Να ρωτήσω κάτι άλλο πως κάνω CHMOD σε ένα φάκελο windows? Μήπως φταίει αυτό?

Άβαταρ μέλους
manos2010grr
Δημοσιεύσεις: 159
Εγγραφή: 17 Ιαν 2007 18:13
Επικοινωνία:

download αρχείο αλλαγή μεγέθους

Δημοσίευση από manos2010grr » 05 Απρ 2011 14:56

Αν πας εδώ php manual readfile ίσως να βγάλεις μια άκρη!

Απάντηση

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

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

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες