Ruby on Rails sprawdzanie parametrów pliku

Mam formularz w którym wybieram sobie plik do wysłania na serwer. Chciałbym ten plik sprawdzić przed wysłaniem, czy nie jest większy niż 2MB, oraz czy jego rozszerzenie jest dopuszczalne.

Jak to zrobić?

2 lata, 3 miesiące temu | edytowane przez: lqc 3965112

  • Po pierwsze, skoro ma to być przed wysłaniem pliku, to nie wiem co tu robi tag ROR. Można napisać skrypt JS, który po zmianie pliku/wysłaniu sprawdzi nazwę i rozmiar.

    Kontrolki typu 'file' mają atrybut files, który jest tablicą wybranych plików. Każdy z nich ma dwa atrybuty fileName i fileSize (przynajmniej w FF i Webkit, nie wiem jak w IE).

    Przykład

    <html>
    <head><title>File Test</title></head>
    <body>
    <form action="#" method="POST">
    Plik: <input type="file" name="file" id="plik"></input>
    <input type="submit">
    </form>
    <script type="text/javascript">
    var fileInput = document.getElementById("plik");
    fileInput.onchange = function() 
    {   
        // IE oczywiście nie ma takich bajerów, pewnie jakiś ActiveX musi być
        if(!this.files) {
            // ale samą nazwę możemy sprawdzić używając value
            if(! this.value.match(/.+\.jpg/i)) {
               alert("Musisz wybrać plik z rozszerzeniem jpg");
            }
            return true;
        }
    
        if(this.files.length != 1) {
           alert("Musisz zaznaczyć dokładnie 1 plik");
           this.value = "";
           return false;
       }
    
        var name = this.files[0].fileName;
        var size = this.files[0].fileSize;
    
        if(! name.match(/.+\.jpg/i)) {
           alert("Musisz wybrać plik z rozszerzeniem jpg");
           this.value = "";
           return false;
        }
    
        if(size > 200) {
           alert("Plik musi mieć mniej niż 200 bajtów");
           this.value = "";
           return false;
        }
    
        return true;
    }
    </script>
    </body>
    </html>
    

    Oczywiście alert() należy zastąpić czymś mądrzejszym odpowiednim dla twojej strony.

    Ogólnie, to na pewno jest jakiś plugin do np. jQuery, który to robi, trzeba tylko poszukać.

  • Na początek zobacz dwa sprawdzone pluginy:

    attachment_fu

    paperclip

    Wydaje mi się, że ich funkcjonalność się usatysfakcjonuje. Z kolei jeżeli chcesz to zrobić samodzielnie to zapoznaj się z API helpera file field tag: APIdock

    Możesz określić jakie MIME będą akceptowane, natomiast rozmiar pliku będziesz musiał sprawdzić samodzielnie po otrzymaniu wysłanego formularza(jeśli programujesz RESTowo to akcje create, update).

  • Musisz szukać czegoś związanego z JavaScriptem.

    Ale generalnie chodzi mi o coś innego- po wysłaniu pliku, musisz go i tak sprawdzać na serwerze- z założenia, wszelkie dane pochodzące od usera są potencjalnie niebezpieczne, można 'w locie' podmienić wszystko co jest wysyłane do serwera, już po sprawdzeniu przez JS.

  • Nie odczytasz przy pomocy JS wielkości pliku (zob), ani też mime. Jeśli chcesz uzyskać wiarygodne informacje o pliku niestety zawsze musisz wysłać go na serwer. Możesz to zrobić przy pomocy ajaxa bez przeładowania strony.

Zaloguj się, aby dodać swoją odpowiedź