Kontrola přípony obrázku ve FormView   otázka

C#, ASP.NET WebForms

V režimu aktualizace je níže uvedený kód, který správně pracuje.

protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
    {
        var fileUpload1 = (FileUpload)FormView1.FindControl("ImageIdFileUpload");
        if (fileUpload1.HasFile)
        {
            string fileName = Server.HtmlEncode(fileUpload1.FileName);
            string extension = Path.GetExtension(fileName);
            if (!extension.Contains("jpg"))
            {
                string er = "Vložit lze jen obrázek ve formátu jpg";
                Label1.Text = er;
            }

......

V režimu vkládání však kontrola na příponu souboru neproběhne při stejném kódu

protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
    {
        var fileUpload1 = (FileUpload)FormView1.FindControl("ImageIdFileUpload");
        if (fileUpload1.HasFile)
        {
            string fileName = Server.HtmlEncode(fileUpload1.FileName);
            string extension = Path.GetExtension(fileName);
            if (!extension.Contains("jpg"))
            {
                string er = "Vložit lze jen obrázek ve formátu jpg";
                Label1.Text = er;
            }

......

Můžete někdo poradit?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1. Pro vkládání kódu používejte tlačítko VB Code (to je jedno, že je kód v C#).

2. Co znamená, že kontrola na příponu neproběhne? Událost se nevyvolá (to poznáte tak, že do ní dáte breakpoint nebo v ní vyhodíte vlastní výjimku), nebo validace proběhne, label se vyplní, ale vložení do databáze přesto proběhne.

3. Tohle se typicky a čistě řeší pomocí validátorů - stačí použít CustomValidator a v události ServerValidate ověřit, že je vše v pořádku. Nemusíte tak ošetřovat dvě události a v okamžiku, kdy byste valídací prováděl více, budete mít v těch metodách pěkný zmatek.

4. Ověřit, že soubor má příponu jpg je sice fajn, ale daleko lepší test je zkusit soubor načíst (třeba metodou System.Drawing.Image.FromFile) a chytat výjimku, pokud se to nepovede. Tím budete mít jistotu, že vám uživatel podstrčil korektní obrázek a ne nějaký xindl s příponou jpg. Navíc některé jpg obrázky mívají i příponu jpeg.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Navíc některé jpg obrázky mívají i příponu jpeg.

A netestuje se jestli přípona obsahuje řetězec JPG? Ale to by mohl být problém, třeba Malování ukládá s velkými příponami.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lenže "jpeg".Contains("jpg") vráti False, pretože medzi "jp" a "g" je niečo navyše(to "e") . Keď neviete, či je tam JPG alebo jpg, stačí

s.ToLower().Contains("jpg")

a za predpokladu, že premenná "s" je reťazec obsahujúci príponu, tak to vráti True aj pre "JPG" a aj pre "jpg".

Najlepšie bude to spraviť tak, ako vám poradil p. Herceg(skúsiť načítať obrázok pomocou GDI+ a chytať výnimku).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Řešit, jestli je přípona malým nebo velkým písmenem je opravdu nesmysl. Nejjednodušší a nejspolehlivější je načíst to a chytat výjimku, pokud se to nepovede.

Jinak porovnávat řetězce tak, že je převedete metodou ToLower je neefektivní, protože tím se vytváří nový string. Dalejo lepší je použít string.Equals.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback