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

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

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

Απάντηση
gtsoukn
Δημοσιεύσεις: 33
Εγγραφή: 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
Δημοσιεύσεις: 33
Εγγραφή: 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
Δημοσιεύσεις: 33
Εγγραφή: 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
Δημοσιεύσεις: 33
Εγγραφή: 23 Ιούλ 2015 13:36

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

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

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

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

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

gtsoukn
Δημοσιεύσεις: 33
Εγγραφή: 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);

Απάντηση

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

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

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