Nahrávám obrázky na servlet. Ověření, zda je nahraný soubor obrázkem, se provádí pouze na straně serveru kontrolou magických čísel v záhlaví souboru. Existuje nějaký způsob, jak ověřit rozšíření na straně klienta před odesláním formuláře na servlet? Jakmile stisknu enter, začne se nahrávat.
Na straně klienta používám Javascript a jQuery.
Aktualizace: Nakonec jsem skončil s validací na straně serveru, která čte bajty a odmítá upload, pokud to není obrázek.
Odpověď
Je možné zkontrolovat pouze příponu souboru, ale uživatel může snadno přejmenovat virus.exe na virus.jpg a „předat“ ověření.
Co stojí za to, zde je kód pro kontrolu přípony souboru a přerušení, pokud nesplňuje jednu z platných přípon:(vyberte neplatný soubor a zkuste odeslat, abyste viděli upozornění v akci)
var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"]; function Validate(oForm) { var arrInputs = oForm.getElementsByTagName("input"); for (var i = 0; i < arrInputs.length; i++) { var oInput = arrInputs[i]; if (oInput.type == "file") { var sFileName = oInput.value; if (sFileName.length > 0) { var blnValid = false; for (var j = 0; j < _validFileExtensions.length; j++) { var sCurExtension = _validFileExtensions[j]; if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) { blnValid = true; break; } } if (!blnValid) { alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", ")); return false; } } } } return true; }
<form onsubmit="return Validate(this);"> File: <input type="file" name="my file" /><br /> <input type="submit" value="Submit" /> </form>
Všimněte si, že kód uživateli umožní odeslat bez výběru souboru… pokud je to vyžadováno, odstraňte řádek if (sFileName.length > 0) {
a je to přidružená uzavírací závorka. Kód ověří jakýkoli vstup souboru ve formuláři bez ohledu na jeho název.
To lze provést pomocí jQuery v menším počtu řádků, ale „surový“ JavaScript mi vyhovuje a konečný výsledek je stejný.
V případě, že máte více souborů nebo chcete spustit kontrolu při změně souboru a nejen při odesílání formuláře, použijte místo toho tento kód:
var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"]; function ValidateSingleInput(oInput) { if (oInput.type == "file") { var sFileName = oInput.value; if (sFileName.length > 0) { var blnValid = false; for (var j = 0; j < _validFileExtensions.length; j++) { var sCurExtension = _validFileExtensions[j]; if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) { blnValid = true; break; } } if (!blnValid) { alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", ")); oInput.value = ""; return false; } } } return true; }
File 1: <input type="file" name="file1" onchange="ValidateSingleInput(this);" /><br /> File 2: <input type="file" name="file2" onchange="ValidateSingleInput(this);" /><br /> File 3: <input type="file" name="file3" onchange="ValidateSingleInput(this);" /><br />
Toto zobrazí upozornění a resetuje vstup v případě neplatné přípony souboru.