Próbuję sprawdzić poprawność typu pliku atrybutu HttpPostedFileBase
, aby sprawdzić typ pliku, ale nie mogę tego zrobić, ponieważ sprawdzanie poprawności mija. Jak mogłem to zrobić?Jak sprawdzić typ pliku atrybutu HttpPostedFileBase w Asp.Net MVC 4?
próbuje
model
public class EmpresaModel{
[Required(ErrorMessage="Choose a file .JPG, .JPEG or .PNG file")]
[ValidateFile(ErrorMessage = "Please select a .JPG, .JPEG or .PNG file")]
public HttpPostedFileBase imagem { get; set; }
}
HTML
<div class="form-group">
<label for="@Html.IdFor(model => model.imagem)" class="cols-sm-2 control-label">Escolha a imagem <img src="~/Imagens/required.png" height="6" width="6"></label>
@Html.TextBoxFor(model => Model.imagem, new { Class = "form-control", placeholder = "Informe a imagem", type = "file" })
@Html.ValidationMessageFor(model => Model.imagem)
</div>
ValidateFileAttribute
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Web;
//validate file if a valid image
public class ValidateFileAttribute : RequiredAttribute{
public override bool IsValid(object value)
{
bool isValid = false;
var file = value as HttpPostedFileBase;
if (file == null || file.ContentLength > 1 * 1024 * 1024)
{
return isValid;
}
if (IsFileTypeValid(file))
{
isValid = true;
}
return isValid;
}
private bool IsFileTypeValid(HttpPostedFileBase file)
{
bool isValid = false;
try
{
using (var img = Image.FromStream(file.InputStream))
{
if (IsOneOfValidFormats(img.RawFormat))
{
isValid = true;
}
}
}
catch
{
//Image is invalid
}
return isValid;
}
private bool IsOneOfValidFormats(ImageFormat rawFormat)
{
List<ImageFormat> formats = getValidFormats();
foreach (ImageFormat format in formats)
{
if(rawFormat.Equals(format))
{
return true;
}
}
return false;
}
private List<ImageFormat> getValidFormats()
{
List<ImageFormat> formats = new List<ImageFormat>();
formats.Add(ImageFormat.Png);
formats.Add(ImageFormat.Jpeg);
//add types here
return formats;
}
}
Twój 'ValidateFileAttribute' nie powinny dziedziczyć' RequiredAttribute', a także nie będzie walidacji po stronie klienta. Musisz utworzyć własny atrybut sprawdzania poprawności, który dziedziczy z 'ValidationAttribute' i implementuje' IClientValidatable'. –
@StephenMuecke jak mogłem to zrobić? czy masz jakiś przykład? – FernandoPaiva
Ale jest trochę niejasne, co chciałbyś sprawdzić - twój plik 'file.ContentLength> 1 * 1024 * 1024' sugeruje, że chcesz mieć maksymalny rozmiar pliku (typ pliku i walidacja rozmiaru pliku to 2 oddzielne rzeczy i muszą to być 2 oddzielne atrybuty) –