Κατέβασμα αρχείων με ελληνικά ονόματα

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

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

Απάντηση
gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 23 Ιούλ 2015 13:58

Καλησπέρα στην ομάδα.

Έχω ένα "θέμα" με το κατέβασμα (λήψη) αρχείων τα οποία τα ονόματά τους είναι στα Ελληνικά.

Συγκεκριμένα, το site είναι στημένο σε php και mySQL.
Για να μην κάνω διαφήμιση (δεν μου αρέσει), η βάση δεδομένων περιέχει κάποια στοιχεία και οι χρήστες επιλέγουν τι θα κατεβάσουν.
Τα αρχεία δημιουργούνται αυτόματα, συμπιέζονται (zip) και αποστέλλονται στον χρήστη.
Σε κάποιες (αρκετές) περιπτώσεις, τα ονόματα των αρχείων πρέπει να είναι στα Ελληνικά.

Τα αρχεία δημιουργούνται σωστά (π.χ. Όνομα Αρχείου.txt), αλλά στη συμπίεση οι ελληνικοί χαρακτήρες, μόνο στο όνομα του αρχείου γίνονται "ιεροφλυφικά", το περιεχόμενο παραμένει με τους ελληνικούς χαρακτήρες.
Να σημειώσω ότι αυτό συμβαίνει μόνο όταν ο χρήστης ζητάει αρχείο από υπολογιστή (Windows). Σε κινητή συσκευή (τηλέφωνο, tablet Android) δεν υπάρχει πρόβλημα, κατεβαίνουν σωστά.

Επίσης, το (πλέον) παρανοϊκό είναι ότι τρέχοντας το site τοπικά με το XAMPP συμβαίνει ακριβώς το ανάποδο.
Τα προσωρινά αρχεία (πάντα όταν πρόκειται για ελληνικούς χαρακτήρες) δημιουργούνται με ιερογλυφικά αλλά στη συμπίεση φαίνονται κανονικά.

Μπορεί να καταλάβει κάποιος τι φταίει;
Υπάρχει περίπτωση γι' αυτό να οφείλεται ο server;

Ευχαριστώ,
Γιώργος.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από dva_dev » 23 Ιούλ 2015 17:16

Είχα δει παλιότερα παρόμοια συμπεριφορά και σε κάποιους browsers έπαιζε σωστά σε κάποιυς δεν εμφανιζόντουσαν τα ελληνικά - ειδικά αν υπήρχε space μέσα στο όνομα του αρχείου.
Οπότε το είχα ψάξει λίγο (δεν θυμάμαι αν είχα δοκιμάσει τι γίνεται σε smart phones και tablets) και κατέληξα στην εξής μαϊμουδιά που αναφέρω και εδώ:

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

function writeFile($filename, $data)
{
    header('content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document; charset=UTF-8');

    $agent = $_SERVER['HTTP_USER_AGENT'];
    if (strlen(strstr(strtolower($agent), 'firefox')) > 0) {
        $filename = str_replace(' ','%20',$filename);
        header("Content-Disposition: attachment; filename*=UTF8''$filename;");
    }
    else {
        $filename = str_replace('+',' ',urlencode($filename));
        header("Content-Disposition: attachment; filename=$filename;");
    }
    echo $data;
}
Το πρώτο header πρέπει να το φέρεις στα μέτρα σου για να έχει το content-type που χρειάζεσαι, γιατί αυτό δημιουργεί word documents.

Δοκιμάζεις και μας λες που δεν έπαιξε.

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 23 Ιούλ 2015 21:55

Καλησπέρα και ευχαριστώ για την απάντηση.

Να πω, και ίσως έπρεπε να το αναφέρω στο πρώτο post, ότι είμαι άσχετος από προγραμματισμό και είναι η πρώτη φορά που ασχολούμαι με κάτι τέτοιο.
Σε ό,τι έχω φτιάξει, πήρα παραδείγματα από διάφορες πηγές στο internet και τα προσάρμοσα στις ανάγκες μου.

Στο συγκεκριμένο, διόρθωσα ό,τι καταλάβαινα από τον κώδικα που δίνεις αλλά χωρίς αποτέλεσμα.
Επίσης, απ' ό,τι είδα για τον Firefox αντικαθιστάς τα κενά με το "%20". Αν είναι έτσι, δεν με εξυπηρετεί.

Ο κώδικας που έχω τώρα είναι ψιλο-αλλαγμένος από εδώ μιας και αναφέρεται σε εικόνες.

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

$files = array($poifile, $iconfile, $voicefile);

$valid_files = array();
if(is_array($files)) {
    foreach($files as $file) {
        if(file_exists($file)) {
            $valid_files[] = $file;
        }
    }
}
 
if(count($valid_files > 0)){
    $zip = new ZipArchive();
    if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){
        $error .= "Η δημιουργία του zip απέτυχε";
    }
    foreach($valid_files as $file){
        $zip->addFile($file);
    }
    $zip->close();
    if(file_exists($zip_name)){
        // force to download the zip
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false);
        header('Content-type: application/zip');
        header('Content-Disposition: attachment; filename="' . $zip_name . '"');
        readfile($zip_name);
        // remove temp files
		//unlink($zip_name);
		//unlink($poifile);
		//unlink($iconfile);
		//unlink($voicefile);
	}
} else {
    echo "No valid files to zip";
    exit;
}
* Έχω ακυρώσει τη διαγραφή των προσωρινών αρχείων για να τα βλέπω.

Παρόλα αυτά, αν είναι μόνο θέμα του browser, δεν θα έπρεπε να εμφανίζει το πρόβλημα και όταν το τρέχω τοπικά;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από dva_dev » 23 Ιούλ 2015 22:11

Δοκίμασε κάπου στην αρχή του αρχείου σου να βάλεις αυτό:

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

function DownloadFileHeader($filename) 
{ 
	$agent = $_SERVER['HTTP_USER_AGENT']; 
	if (strlen(strstr(strtolower($agent), 'firefox')) > 0) { 
	    $filename = str_replace(' ','%20',$filename); 
	    return "Content-Disposition: attachment; filename*=UTF8''$filename;"; 
	} 
	else { 
	    $filename = str_replace('+',' ',urlencode($filename)); 
	    return "Content-Disposition: attachment; filename=$filename;"; 
	} 
}
και χαμηλά στον κωδικά σου, πριν το readfile($zip_name) να αλλάξεις το

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

//header('Content-Disposition: attachment; filename="' . $zip_name . '"');
σε

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

header(DownloadFileHeader($zip_name));

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 24 Ιούλ 2015 01:43

Το function το έβαλα αμέσως μετά τη σύνδεση στη βάση.
Έκανα και τις άλλες αλλαγές αλλά δυστυχώς τίποτα, καμία αλλαγή στο αποτέλεσμα.
Αν μπορώ να βοηθήσω δίνοντας περισσότερα στοιχεία, πολύ ευχαρίστως.

Αλλά, sorry που επιμένω, η διαφορά στη λειτουργία τοπικά και online εξηγείται;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από dva_dev » 24 Ιούλ 2015 02:08

Στο μηχάνημά σου έχεις windows. Στον server που είναι online η σελίδα σου τι έχεις;
Η γνώμη μου είναι ότι δοκιμές δεν μπορείς να κάνεις με το xampp ούτε το wamp. Στήνεις ένα virtual machine με σετάρισμα αντίστοιχο με αυτό που έχεις στον server και κάνεις δοκιμές εκεί.
Δεν έχω δοκιμάσει xampp ή wamp. Αυτά που έχω δοκιμάσει είναι linux/apache/php και windows/iis/aspx.

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 24 Ιούλ 2015 02:33

Εγώ όντως τρέχω σε Windows.
Ο server μου δίνει Linux.
Το XAMPP υποστηρίζει Linux.
Δεν ξέρω αν έχει κάποια σχέση, τυχόν αλλαγές για το forum τις δοκιμάσω πρώτα τοπικά με το XAMPP και μετά τις ανεβάζω στο server.

Ενημερωτικά, έχω παρατηρήσει και σε άλλα σημεία διαφορετική συμπεριφορά τοπικά και online χωρίς όμως να υπάρχει εμφανές πρόβλημα.

Το συγκεκριμένο πρόβλημα το έχω αναφέρει και στον server και περιμένω κάποια απάντηση.
Αλλά τα forums λειτουργούν πιο γρήγορα :D

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 23 Σεπ 2015 15:45

Καλησπέρα.

Έστω και καθυστερημένα το πρόβλημα λύθηκε με βοήθεια από ανθρώπους του server που με φιλοξενεί.
...το πρόβλημα φαίνεται ότι ήταν καθαρά προγραμματιστικό και αφορούσε τον τρόπο συμπεριφοράς του ziparchive που χρησιμοποιείται από την εφαρμογή σας για τη συμπίεση των αρχείων, μιας και το ίδιο το ziparchive δεν υποστηρίζει UTF-8. Έτσι λοιπόν, στο αρχείο ****.php έχω τροποποιήσει τη γραμμή 68 ώστε να είναι ως εξής:

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

$zip->addFile($file, iconv("UTF-8","CP437",$file));
από

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

$zip->addFile($file);

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Re: Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 11 Οκτ 2018 16:07

Καλησπέρα.

Επαναφέρω το θέμα μιας και το πρόβλημα επανήλθε.

Μέχρι τώρα στο site μου (http://pois.4gps.gr/) που είναι σε php και MySQL για συμπίεση των αρχείων έχω το

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

$zip->addFile($file, iconv("UTF-8","CP437",$file));
και λειτουργεί άψογα.

Μετατρέποντας το site σε PDO δεν λειτουργεί και μετατρέπει τα ελληνικά ονόματα των αρχείων σε ιερογλυφικά.

Εν συντομία, από το site ο χρήστης επιλέγει κατεβάζει κάποια δεδομένα και τα ονόματα των αρχείων σε κάποιες περιπτώσεις πρέπει απαραίτητα να είναι με Ελληνικούς χαρακτήρες.
Ενδεικτικά, μπορείτε να δείτε το πρόβλημα στο http://testpois.4gps.gr/categorypois.php?CategoryID=27 επιλέγοντας π.χ. να κατεβάσετε τα δεδομένα για το λογισμικό "Aponia".
Στην ίδια περίπτωση στο http://pois.4gps.gr/categorypois.php?CategoryID=27 τα αρχεία κατεβαίνουν σωστά.

Να υπενθυμίσω ότι τρέχοντας το site (testpois) τοπικά με το XAMPP συμβαίνει ακριβώς το ανάποδο.
Τα προσωρινά αρχεία (πάντα όταν πρόκειται για ελληνικούς χαρακτήρες) δημιουργούνται με ιερογλυφικά αλλά στη συμπίεση φαίνονται κανονικά.

Η έκδοση php και στο site και στο XAMPP είναι 5.6.38.

Κάθε πρόταση-βοήθεια δεκτή.
Επιπλέον στοιχεία διαθέσιμα.
Γιώργος

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Re: Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 12 Οκτ 2018 12:49

Το πρόβλημα αποκαταστάθηκε.
Γιώργος

Kinhthra
Δημοσιεύσεις: 286
Εγγραφή: 16 Φεβ 2011 02:37
Επικοινωνία:

Re: Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από Kinhthra » 15 Οκτ 2018 04:00

gtsoukn έγραψε:
12 Οκτ 2018 12:49
Το πρόβλημα αποκαταστάθηκε.
μετά από τόσα χρόνια :hammer: :hammer: :kaloe: :kaloe: :kaloe:

gtsoukn
Δημοσιεύσεις: 37
Εγγραφή: 23 Ιούλ 2015 13:36

Re: Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από gtsoukn » 17 Οκτ 2018 12:50

Καλησπέρα φίλε μου.

Μάλλον δεν διάβασες με προσοχή όλο το θέμα.
Η πρώτη εμφάνιση του προβλήματος ήταν όταν άνοιξα το θέμα (23/7/15) και λύθηκε στις 23/9/15.

Επανεμφανίστηκε τώρα που αναβαθμίζω το site σε pdo λόγω μη αναβάθμισης της έκδοσης php και λύθηκε αμέσως.
Γιώργος

Kinhthra
Δημοσιεύσεις: 286
Εγγραφή: 16 Φεβ 2011 02:37
Επικοινωνία:

Re: Κατέβασμα αρχείων με ελληνικά ονόματα

Δημοσίευση από Kinhthra » 20 Οκτ 2018 00:40

gtsoukn έγραψε:
17 Οκτ 2018 12:50
Καλησπέρα φίλε μου.

Μάλλον δεν διάβασες με προσοχή όλο το θέμα.
Η πρώτη εμφάνιση του προβλήματος ήταν όταν άνοιξα το θέμα (23/7/15) και λύθηκε στις 23/9/15.

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

Απάντηση

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

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

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