Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με ανέβασμα φακέλου σε FTP

Îåêßíçóå áðü ôï ìÝëïò airboy. Τελευταία δημοσίευση από το μέλος airboy στις 06-11-2012, 21:01. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-10-2012, 14:17 71487

    Πρόβλημα με ανέβασμα φακέλου σε FTP

    Καλησπέρα,
    Ενδεχομένως να έχει αντιμετωπίσει κιάλλος αυτό το πρόβλημα αλλά δεν μπορώ να βρώ λύση...
    Φτιάχνω μια εφαρμογή η οποία ανεβάζει κάτι φακέλους σε ftp. Όμως οι φάκελοι αυτοί είναι στα Ελληνικά.
    Οπότε τους ανεβάζει με όνομα "?????". Δηλαδή δεν αναγνωρίζει τους ελληνικούς χαρακτήρες.
    Όποιος ξέρει κάτι ας βοηθήσει.. έχω ψάξει όλο το ίντερνετ..
    Ευχαριστώ
  •  29-10-2012, 13:10 71494 σε απάντηση της 71487

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Αυτό συμβαίνει όταν προσπαθείς να αποθηκεύσεις/ανεβάσεις/μετατρέψεις ελληνικούς χαρακτήρες σε ASCII ή οποιοδήποτε άλλο codepage. Οι χαρακτήρες ή θα εμφανιστούν "κινέζικοι" ή θα δεις κουτάκια, ή ερωτηματικά. Το όνομα ενός αρχείου είναι στην πραγματικότητα ένα URL οπότε θα πρέπει να χρησιμοποιήσεις είτε unicode ονόματα (αν το υποστηρίζει ο FTP Server) ή να κάνεις URL encode το όνομα του αρχείου πριν το ανεβάσεις. Διαφορετικά ο server θα προσπαθήσει να αποθηκεύσει το όνομα ως ASCII. 

    Δεν λες πως ανεβάζεις τα αρχεία, αν το κάνεις με κώδικα ή με κάποιο πρόγραμμα για να σου απαντήσουμε πως να το κάνεις σωστά. Θα πρέπει επίσης να αναφέρεις τί είναι ο ftp server (IIS? κάτι άλλο? έκδοση?) γιατί μπορεί ο ίδιος ο FTP servers να έχει πρόβλημα με non-Ascii χαρακτήρες

    Αν ψάξεις για "ftp non-ascii file names" θα δεις ότι πολύς κόσμος έχει το ίδιο πρόβλημα.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  29-10-2012, 21:16 71498 σε απάντηση της 71494

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Σ' ευχαριστώ πολύ για την απάντηση... τελικά βρήκα λύση στο πρόβλημά μου και την παραθέτω εδώ μήπως την χρειαστεί και κάποιος άλλος.
    Χρησιμοποιώ VS2008, linux server και γράφω σε C#
    O παρακάτω κώδικας παίρνει ένα όνομα και το μετατρέπει απο το Encoding του υπολογιστή σε ελληνικό encoding και αντίστροφρα

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public string greekEncoder(string original)
            {
                Encoding sourceEncoding = Encoding.UTF8;
    
                Encoding targetEncoding = Encoding.GetEncoding(1253);
    
                byte[] encodeTheseChars = sourceEncoding.GetBytes(original);
    
                String recoded_string = targetEncoding.GetString(encodeTheseChars);
    
                Console.WriteLine("string= {0}", recoded_string);
                return recoded_string;
            }
    public string greekDecoder(string original)
            {
                Encoding sourceEncoding = Encoding.GetEncoding(1253);
    
                Encoding targetEncoding = Encoding.Default;
    
                byte[] encodeTheseChars = sourceEncoding.GetBytes(original);
    
                String recoded_string = targetEncoding.GetString(encodeTheseChars);
    
                Console.WriteLine("string= {0}", recoded_string);
                return recoded_string;
            }

    το string που επιστρέφεται έρχεται κωδικοποιημένο.
    Σε εμένα δούλεψε και ελπίζω να βοήθησα και κάποιον που το ψάχνει
    Ευχαριστώ!
  •  30-10-2012, 10:19 71500 σε απάντηση της 71498

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Μπορείς και από το μενού του visual studio 

    File-->Advanced Save Options -->Encoding

    Edit 
    Αυτό είναι για το περιεχόμενο , όχι το όνομα του αρχείου
  •  31-10-2012, 11:56 71510 σε απάντηση της 71498

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Και τί στέλνεις στον FTP server? Το 1253? Αυτό είναι το αντίθετο από αυτό που σου πρότεινα. Αντί να φροντίσεις να έχεις παντού Unicode, κάνεις μετατροπές μεταξύ codepages. Ο κώδικας σου θα δουλέψει MONO ο linux server θεωρεί ότι το Ascii codepage είναι το 1253. Αυτό που κάνεις θα δουλέψει μόνο στον συγκεκριμένο server. Αυτό που έκανες σπάει τον τρόπο που δουλεύει το FTP και θα σου δημιουργήσει προβλήματα σε άλλους servers.

    Ένας server ο οποίος υποστηρίζει σωστά το UTF8 είναι ο FileZilla και υπάρχει και ένα άρθρο το οποίο περιγράφει ακριβώς το πρόβλημα που έχεις και ποιά είναι η σωστή συμπεριφορά που υλοποιεί ο FileZilla με τις στάνταρ εντολές FEAT και OPTS. Θα δεις ότι η σωστή συμπεριφορά είναι ο FTP Server να θεωρεί ότι τα ονόματα είναι πάντα UTF8. Ο client το καταλαβαίνει αυτό με την εντολή FEAT η οποία θα του πει αν ο server υποστηρίζει UTF8 ή όχι. Κάποιοι αρχαίοι linux ftp servers όμως δεν υποστηρίζουν το UTF8 οπότε θα πρέπει να δεις ποιός είναι ο server, ποιά είναι η έκδοση του. Μάλιστα, μήπως είναι ώρα να γίνει upgrade αυτό ο server σε κάτι πιο σύγχρονο? Η υποστήριξη UTF8 μπήκε το 1999. 

    Αν ρίξεις μία ματιά στο Uploading a file using FTP and the WebClient θα δεις ότι ο WebClient στέλνει και ένα OPTS UTF8 ON πριν ανεβάσει ένα αρχείο, επειδή κάποιοι παλιότεροι servers δεν καταλάβαιναν το UTF8 αν δεν έδινες αυτή την εντολή. Κανονικά, ο FTP server θα έπρεπε να χρησιμοποιήσει UTF8 ακόμα και χωρίς το OPTS UTF8 ON.  Μόνο αν πρόκειται για non-standard server έχει νόημα να ασχοληθείς με τα codepages. 

    Σε καμμία περίπτωση όμως δεν θα πρέπει να βασίσεις την συμπεριφορά της εφαρμογής σου σε εξαιρέσεις όπως αυτή. Η αλλαγή codepage θα πρέπει να χρησιμοποιηθεί μόνο ως η απολύτως τελευταία λύση. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  31-10-2012, 13:43 71512 σε απάντηση της 71510

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Εννοώ ότι μπορείς να αλλάζεις τα codepages.
    Αν ήταν ήδη σε κάποιο "λάθος" codepage (1253) να το μετατρέψεις σε "σωστό" (Unicode)


  •  31-10-2012, 13:52 71513 σε απάντηση της 71512

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Νίκο, το post απευθυνόταν στον airboy. Η αλλαγή του code page ενός αρχείου μέσω του Visual Studio μπορεί να είναι χρήσιμη αν πχ. έχεις ένα HTML, ASPX ή text αρχείο σε Ascii encoding, δεν βοηθάει όμως σε τίποτα όταν αυτό που ζητάς είναι πως θα κάνεις upload το συγκεκριμένο αρχείο χρησιμοποιώντας unicode ονόματα.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  31-10-2012, 13:56 71514 σε απάντηση της 71513

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Μπερδεύτηκα με τους αριθμούς των απαντήσεων   "xxxxxxxx σε απάντηση της yyyyyyyy" Smile
  •  04-11-2012, 19:51 71531 σε απάντηση της 71510

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Παναγιώτης Καναβός:
    Και τί στέλνεις στον FTP server? Το 1253? Αυτό είναι το αντίθετο από αυτό που σου πρότεινα. Αντί να φροντίσεις να έχεις παντού Unicode, κάνεις μετατροπές μεταξύ codepages. Ο κώδικας σου θα δουλέψει MONO ο linux server θεωρεί ότι το Ascii codepage είναι το 1253. Αυτό που κάνεις θα δουλέψει μόνο στον συγκεκριμένο server. Αυτό που έκανες σπάει τον τρόπο που δουλεύει το FTP και θα σου δημιουργήσει προβλήματα σε άλλους servers.

    Ένας server ο οποίος υποστηρίζει σωστά το UTF8 είναι ο FileZilla και υπάρχει και ένα άρθρο το οποίο περιγράφει ακριβώς το πρόβλημα που έχεις και ποιά είναι η σωστή συμπεριφορά που υλοποιεί ο FileZilla με τις στάνταρ εντολές FEAT και OPTS. Θα δεις ότι η σωστή συμπεριφορά είναι ο FTP Server να θεωρεί ότι τα ονόματα είναι πάντα UTF8. Ο client το καταλαβαίνει αυτό με την εντολή FEAT η οποία θα του πει αν ο server υποστηρίζει UTF8 ή όχι. Κάποιοι αρχαίοι linux ftp servers όμως δεν υποστηρίζουν το UTF8 οπότε θα πρέπει να δεις ποιός είναι ο server, ποιά είναι η έκδοση του. Μάλιστα, μήπως είναι ώρα να γίνει upgrade αυτό ο server σε κάτι πιο σύγχρονο? Η υποστήριξη UTF8 μπήκε το 1999. 

    Αν ρίξεις μία ματιά στο Uploading a file using FTP and the WebClient θα δεις ότι ο WebClient στέλνει και ένα OPTS UTF8 ON πριν ανεβάσει ένα αρχείο, επειδή κάποιοι παλιότεροι servers δεν καταλάβαιναν το UTF8 αν δεν έδινες αυτή την εντολή. Κανονικά, ο FTP server θα έπρεπε να χρησιμοποιήσει UTF8 ακόμα και χωρίς το OPTS UTF8 ON.  Μόνο αν πρόκειται για non-standard server έχει νόημα να ασχοληθείς με τα codepages. 

    Σε καμμία περίπτωση όμως δεν θα πρέπει να βασίσεις την συμπεριφορά της εφαρμογής σου σε εξαιρέσεις όπως αυτή. Η αλλαγή codepage θα πρέπει να χρησιμοποιηθεί μόνο ως η απολύτως τελευταία λύση. 


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

    Ουσιαστικά μετά απο πολύ διάβασμα και ψάξιμο στο internet για παρόμοιες περιπτώσεις, είδα οτι η C#.Net όταν παράγει ένα αλφαριθμητικό (string) αυτό παράγεται με κωδικοποίηση UTF-16 η οποία δεν περιέχει τους ελληνικούς χαρακτήρες. Έτσι εγώ με τον κώδικά μου γυρίζω το string σε 1253 Encoding για να μπορεί να το παράγει με τους Ελληνικούς χαρακτήρες. Ο κώδικας δεν επηρεάζει το αρχείο, αλλά μόνο το όνομά του. Δεν ξέρω αν είναι λάθος ο τρόπος που το διαχειρίστηκα, που ενδεχομένως να είναι αλλά είναι η πρώτη φορά που δημιουργώ κώδικα για FTP και είχα το συγκεκριμένο πρόβλημα.

    Δεν το έχω δοκιμάσει σε άλλον server αλλά αυτό που μπορώ να σου πω με βεβαιότητα είναι ότι όταν κάνω download το αρχείο πίσω, χρειάζεται decode γιατί μου έρχεται πάλι αλαμπουρνέζικα.

    Αν υπάρχει πιο σωστή λύση ευχαρίστως θα την δεχτώ γιατί το λογισμικό μου θα είναι commercial και θέλω να είναι στην εντέλεια.
    Ευχαριστώ πολύ.
    Αλέξανδρος
  •  05-11-2012, 12:00 71535 σε απάντηση της 71531

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Ακόμα δεν έχεις δώσει τον κώδικα που χρησιμοποιείς για το upload. Χρησιμοποιείς τον WebClient? Το FtpWebRequest? Κάποια άλλη κλάση? Χωρίς τον κώδικα και την έκδοση του server είναι σχεδόν αδύνατο να σε βοηθήσει κανείς.

    Η μορφή του string στη C# δεν έχει σημασία γιατί την μετατροπή την κάνει ο WebClient ή το FtpWebRequest κατά το negotiation. Αν αναναγκάζεσαι να κάνεις decode κάτι πηγαίνει στραβά, ή στον κώδικα σου ή στο server. Συνήθως μπορείς να δεις την έκδοση του server αν κάνεις ένα απλό ftp από το command line. Η έκδοση του server εμφανίζεται στο banner που σου γυρίζει ο server όταν μπεις.

    Από τη στιγμή που θέλεις να χρησιμοποιήσεις τον κώδικα για commercial χρήση θα πρέπει να λύσεις οπωσδήποτε το πρόβλημα αντί να το κουκουλώσεις. Πρώτα θα πρέπει να ελέγξεις ότι ο server υποστηρίζει το σωστό RFC κοιτάζοντας την έκδοση του. Μετά θα πρέπει να δοκιμάσεις να ανεβάσεις ελληνικά αρχεία χρησιμοποιώντας κάποιο άλλο client, ή ακόμα και το command line. Το command line θα είναι πολύ χρήσιμο καθώς θα μπορέσεις  να δώσεις τις εντολές FEAT και OPT για να δεις πως συμπεριφέρεται ο server. 

    Αν δεις ότι ο server δεν υποστηρίζει Unicode, χώστα στον hoster - είναι δική του δουλειά να παρέχει ένα συμβατό ftp server, ή βρες άλλο hoster. 

    Αν όμως δεις ότι το upload δουλεύει με διάφορους clients αλλά όχι με τον κώδικα σου, θα πρέπει να δεις τί συμβαίνει. Πρώτα, θα πρέπει να δοκιμάσεις να κάνεις ένα απλό UploadFile  για να βεβαιωθείς ότι το απλό upload δολεύει. Αν δεις κάτι περίεργο, θα πρέπει να βάλεις το WireShark ή το Fiddler για να δεις τα πακέτα που ανταλλάσονται μεταξύ του κώδικα σου και του server. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  06-11-2012, 21:01 71540 σε απάντηση της 71535

    Απ: Πρόβλημα με ανέβασμα φακέλου σε FTP

    Παναγιώτης Καναβός:
    Ακόμα δεν έχεις δώσει τον κώδικα που χρησιμοποιείς για το upload. Χρησιμοποιείς τον WebClient? Το FtpWebRequest? Κάποια άλλη κλάση? Χωρίς τον κώδικα και την έκδοση του server είναι σχεδόν αδύνατο να σε βοηθήσει κανείς.

    Η μορφή του string στη C# δεν έχει σημασία γιατί την μετατροπή την κάνει ο WebClient ή το FtpWebRequest κατά το negotiation. Αν αναναγκάζεσαι να κάνεις decode κάτι πηγαίνει στραβά, ή στον κώδικα σου ή στο server. Συνήθως μπορείς να δεις την έκδοση του server αν κάνεις ένα απλό ftp από το command line. Η έκδοση του server εμφανίζεται στο banner που σου γυρίζει ο server όταν μπεις.

    Από τη στιγμή που θέλεις να χρησιμοποιήσεις τον κώδικα για commercial χρήση θα πρέπει να λύσεις οπωσδήποτε το πρόβλημα αντί να το κουκουλώσεις. Πρώτα θα πρέπει να ελέγξεις ότι ο server υποστηρίζει το σωστό RFC κοιτάζοντας την έκδοση του. Μετά θα πρέπει να δοκιμάσεις να ανεβάσεις ελληνικά αρχεία χρησιμοποιώντας κάποιο άλλο client, ή ακόμα και το command line. Το command line θα είναι πολύ χρήσιμο καθώς θα μπορέσεις  να δώσεις τις εντολές FEAT και OPT για να δεις πως συμπεριφέρεται ο server. 

    Αν δεις ότι ο server δεν υποστηρίζει Unicode, χώστα στον hoster - είναι δική του δουλειά να παρέχει ένα συμβατό ftp server, ή βρες άλλο hoster. 

    Αν όμως δεις ότι το upload δουλεύει με διάφορους clients αλλά όχι με τον κώδικα σου, θα πρέπει να δεις τί συμβαίνει. Πρώτα, θα πρέπει να δοκιμάσεις να κάνεις ένα απλό UploadFile  για να βεβαιωθείς ότι το απλό upload δολεύει. Αν δεις κάτι περίεργο, θα πρέπει να βάλεις το WireShark ή το Fiddler για να δεις τα πακέτα που ανταλλάσονται μεταξύ του κώδικα σου και του server. 


    Σωστό και αυτό...
    Λοιπόν για να κάνω upload αρχεία ή να δημιουργήσω φάκελο(που και εκεί έχω πρόβλημα) χρησιμοποιώ μια opensource βιβλιοθήκη που βρήκα. Την fptLib. Παρακάτω παραθέτω κομμάτι του κώδικα που κάνει το upload.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
                    FtpConnection ftp = new FtpConnection("ftp.kati.com", "user", "pass");
    
                    ftp.Open(); /* Open the FTP connection */
                    ftp.Login(); /* Login using previously provided credentials */
    
                    if (ftp.DirectoryExists("/Upload")) /* check that a directory exists */
                        ftp.SetCurrentDirectory("/Upload"); /* change current directory */
    
                        
                    try
                    {
                        
                        
                        ftp.PutFile(@"d:\Κάτι.html"); 
                        ftp.CreateDirectory("Φάκελος");
                        ftp.Close();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(String.Format("FTP Error: {0}", ex.Message));
                    }
                

    Πρέπει επίσης να πω οτι δοκίμασα και με τον απλό τρόπο που προσφέρει το .NET 3.5 Framework για την διαχείριση ενός FTP αλλά μάταια...
    Ότι και να κάνω πάλι ερωτηματικά μου βγάζει.
    Τέλος, μίλησα και με τον hoster και μου είπανε οτι δεν είναι πρόβλημα του server. Για να πώ την αλήθεια ενδεχομένως και να το είπανε για να
    αποφύγουν να με εξυπηρετήσουν.

    Τι να πώ... τα σχόλια δικά σας.
    Ευχαριστώ
    Αλέξανδρος

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems