Θα σκάσω! Πρόβλημα με upload μεγάλων αρχείων (100-150 MB)

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

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

Απάντηση
Άβαταρ μέλους
ZauZ
Δημοσιεύσεις: 408
Εγγραφή: 12 Οκτ 2003 23:29
Τοποθεσία: Ηράκλειο
Επικοινωνία:

Θα σκάσω! Πρόβλημα με upload μεγάλων αρχείων (100-150 MB)

Δημοσίευση από ZauZ » 20 Δεκ 2006 00:36

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

Θέλω να φτιάξω ένα script στο οποίο οι χρήστες να μπορούν να ανεβάσουν στο server αρχεία τα οποία όμως θα έχουν μέγεθος από 5 ΜΒ έως και 150 ΜΒ.

Το όλο concept το κάνω και θέλω να γίνεται αποκλειστικά μέσα από το browser. Μέχρι τώρα το κάνω με τον παρακάτω τρόπο

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

(απόσπασμα του κώδικα) 

$uploaddir = '/home21/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['Filedata']['name']);
(move_uploaded_file($_FILES['Filedata']['tmp_name'], $uploadfile)) 
ΤΟ ΠΡΟΒΛΗΜΑ :

Δεν μπορώ να κάνω upload μεγάλα αρχεία. Καταρχίν ΔΕΝ μπορώ να πειράξω το php.ini οπότε προσπάθησα να το κάνω μέσα από το .htaccess όπου το πρόβλημα λύθηκε μόνο εν μέρη. Τοποθετώντας μέσα στο .htaccess τα παρακάτω

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

php_value post_max_size 300M
php_value upload_max_filesize 300M
php_value max_execution_time 3600
Η κατάσταση βελτιώθηκε αφού μπορώ να κάνω upload αρχεία 60-80 ΜΒ αλλά όχι μεγαλύτερα.

Το παράξενο είναι ότι αν βάλω ένα αρχείο π.χ 60 ΜΒ κάνει να το ανεβάσει 2-3 λεπτά και το ανεβάζει κανονικά, αλλά όταν προσπαθώ να ανεβάσω ένα αρχείο π.χ 120 ΜΒ μετά από 1-2 λεπτά πετάει time out error. (μάλλον ο server γράφει κανονικά στα παλιά του τα παπούτσια το php_value max_execution_time 3600 ).

Διαβάζοντας όμως δεξιά και αριστερά διαπίστωσα ότι ο απλός τρόπος μέσο HTTP δεν είναι και ο καλύτερος αφού οι χρήστες με γραμμή DSL δε θα καταφέρνουν να κάνουν upload αρχεία π.χ 200 ΜΒ αφού σίγουρα κάποια στιγμή θα τους πετάει error. (μικρή ταχύτητα upload σε συνδυασμό με μεγάλα αρχεία = μεγάλος χρόνος )

Διάβασα λοιπόν (και εδώ) ότι η καλύτερη λύση είναι τα αρχεία να ανεβαίνουν μέσω FTP αλλά μέσα από το browser.

Και ερωτώ : Υπάρχει τελικά κάποιος απλός σχετικά τρόπος ώστε οι χρήστες με μια απλή φόρμα να μπορούν εύκολα να κάνουν τα upload τους χωρίς να γίνεται timeout η σύνδεση τους ;

Για παράδειγμα να ανοίγει ο browser anonymous ftp ή κάτι τέτοιο και ο χρήστης να κάνει upload το αρχείο του , χωρίς όμως να αντιλαμβάνεται κάποια διαφορά σε σχέση με τον συνηθισμένο τρόπο μέσω http ;;;;

Για παράδειγμα το rapidshare και διάφορες άλλες υπηρεσίες… πώς το κάνουν ; Δε νομίζω ότι απλά άλλαξαν το php.ini το upload limit σε 200 MB. Λογικά με κάποιο άλλο τρόπο γίνετε.

Το θέμα με καίει και πάω να σκάσω… please ρίξτε ιδέες και λύσεις αν γνωρίζετε !

Άβαταρ μέλους
RADICAL
Δημοσιεύσεις: 386
Εγγραφή: 14 Ιούλ 2004 01:07
Τοποθεσία: Athens
Επικοινωνία:

Θα σκάσω! Πρόβλημα με upload μεγάλων αρχείων (100-150 MB)

Δημοσίευση από RADICAL » 20 Δεκ 2006 14:08

Δες έδω μέχρι να σου απαντήσει κάποιος σχετικότερος :)

Είναι οι ftp functions της php.
Εικόνα

Άβαταρ μέλους
ZauZ
Δημοσιεύσεις: 408
Εγγραφή: 12 Οκτ 2003 23:29
Τοποθεσία: Ηράκλειο
Επικοινωνία:

Θα σκάσω! Πρόβλημα με upload μεγάλων αρχείων (100-150 MB)

Δημοσίευση από ZauZ » 20 Δεκ 2006 15:18

ΑΚΥΡΟ (δείτε στο τέλος του post)

Μπορώ να πώ ότι κάποια άκρη έβγαλα αλλά ακόμα δε λειτουργεί...
Αντιμετωπίζω ένα πρόβλημα αφού βγάζει αυτό :

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

Warning: ftp_put() [function.ftp-put]: /home26a/sub002/sc23428-CQIT/www/upload/C:\\Documents and Settings\\ZauZ\\Desktop\\1112asasa.jpg: No such file or directory in /mounted-storage/home26a/sub002/sc23428-CQIT/www/uptest.php on line 30
όπου το

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

C:\\Documents and Settings\\ZauZ\\Desktop\\1112asasa.jpg
είναι μια μεταβλητή

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

$myFile =C:\\Documents and Settings\\ZauZ\\Desktop\\1112asasa.jpg 


και μάλλον για αυτό δε λειτουργεί αφού θα έπρεπε να είναι (υποθέτω) σκέτο το όνομα του αρχείου δηλαδή έτσι :

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

$myFile = 1112asasa.jpg

Αλλά πώς στο καλό θα απομονώσω μόνο το όνομα ;


edit :

Τελικά απομόνωσα το όνομα του αρχείου κάνοντας :

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

$uploadfile = basename($_POST['txt_fileName']['name']);
	 $basename = preg_replace( '/^.+[\\\\\\/]/', '', $myFileName );
αλλά συνεχίζω και πέρνω error :

Warning: ftp_put() [function.ftp-put]: /home26a/sub002/sc23428-CQIT/www/upload/1112asasa.jpg: No such file or directory in /mounted-storage/home26a/sub002/sc23428-CQIT/www/uptest.php on line 36

Καμιά ιδέα ;

Άβαταρ μέλους
ZauZ
Δημοσιεύσεις: 408
Εγγραφή: 12 Οκτ 2003 23:29
Τοποθεσία: Ηράκλειο
Επικοινωνία:

Θα σκάσω! Πρόβλημα με upload μεγάλων αρχείων (100-150 MB)

Δημοσίευση από ZauZ » 20 Δεκ 2006 16:10

Sorry για τα πολλά post αλλά προσπαθώ να σας δώσω όσες περισσότερες πληροφορίες μπορώ:

Λοιπόν ο πλήρες κώδικας είναι παρακάτω

Τι κάνει ; Απλά δημιουργεί μέσα στο φάκελο /www ένα αρχείο 0 Bytes με όνομα : C:\\Documents and Settings\\ZauZ\\Desktop\\1112asasa.jpg

Αν βάλω $basename = preg_replace( '/^.+[\\\\\\/]/', '', $myFileName ); τότε απλά δημιουργεί ένα αρχείο 0 Bytes με όνομα απλά 1112asasa.jpg

Επίσης το script φορτώνει και φορτώνει και στη συνέχεια μου πετάει ένα popup για να αποθηκεύσω λέει το αρχείο testupload.php (έτσι έχω ονομάσει το παρακάτω αρχείο)

Εάν αλλάξω το relative path από /www/ σε /home26a/sub002/sc23428-CQIT/www/
Τότε μου πετάει τα προηγούμενα error.



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

<?php
// 	 $basename = preg_replace&#40; '/^.+&#91;\\\\\\/&#93;/', '', $myFileName &#41;;

  if&#40;isset&#40;$_POST&#91;'SubmitFile'&#93;&#41;&#41;&#123;
     $myFile = $_FILES&#91;'txt_file'&#93;; // This will make an array out of the file information that was stored.
     $file = $myFile&#91;'tmp_name'&#93;;  //Converts the array into a new string containing the path name on the server where your file is.
 
     $myFileName = basename&#40;$_POST&#91;'txt_fileName'&#93;&#41;; //Retrieve filename out of file path

     $destination_file = "/www/".$myFileName;  //where you want to throw the file on the webserver &#40;relative to your login dir&#41;

     // connection settings
     $ftp_server = "ftp.*******";  //address of ftp server.
     $ftp_user_name = "******"; // Username
     $ftp_user_pass = "******";  // Password

     $conn_id = ftp_connect&#40;$ftp_server&#41;;        // set up basic connection
     $login_result = ftp_login&#40;$conn_id, $ftp_user_name, $ftp_user_pass&#41; or die&#40;"<h2>You do not have access to this ftp server!</h2>"&#41;;  // login with username and password, or give invalid user message
     if &#40;&#40;!$conn_id&#41; || &#40;!$login_result&#41;&#41; &#123;  // check connection
             // wont ever hit this, b/c of the die call on ftp_login
             echo "FTP connection has failed! <br />";
             echo "Attempted to connect to $ftp_server for user $ftp_user_name";
             exit;
         &#125; else &#123;
         //    echo "Connected to $ftp_server, for user $ftp_user_name <br />";
     &#125;

     $upload = ftp_put&#40;$conn_id, $destination_file, $file, FTP_BINARY&#41;;  // upload the file
     if &#40;!$upload&#41; &#123;  // check upload status
         echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
     &#125; else &#123;
         echo "Uploading $myFileName Complete!<br /><br />";
     &#125;

     ftp_close&#40;$conn_id&#41;; // close the FTP stream
  &#125;
?>

<html>
  <head>

  </head>
  <body>
       <form enctype="multipart/form-data" action="<?php echo $_SERVER&#91;'PHP_SELF'&#93;;?>" method="POST">
           Please choose a file&#58; <input name="txt_file" type="file" id="txt_file" tabindex="1" size="35" onChange="txt_fileName.value=txt_file.value" />
           <input name="txt_fileName" type="hidden" id="txt_fileName" tabindex="99" size="1" />

           <input type="submit" name="SubmitFile" value="Upload File" accesskey="ENTER" tabindex="2" />
     </form>
  </body>
<html>

Απάντηση

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

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

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