- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试验证 HttpPostedFileBase
的文件类型属性来检查文件类型,但我不能这样做,因为验证正在通过。我怎么能这样做?
试
型号
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; }
}
<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>
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;
}
}
最佳答案
由于您的属性继承自现有属性,因此需要在 global.asax
中注册。 (请参阅 this answer 作为示例),但是 不要在你的情况下这样做。您的验证代码不起作用,文件类型属性不应继承自 RequiredAttribute
- 它需要继承自 ValidationAttribute
如果你想要客户端验证,那么它还需要实现 IClientValidatable
.验证文件类型的属性将是(如果属性为 IEnumerable<HttpPostedFileBase>
并验证集合中的每个文件,请注意此代码)
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FileTypeAttribute : ValidationAttribute, IClientValidatable
{
private const string _DefaultErrorMessage = "Only the following file types are allowed: {0}";
private IEnumerable<string> _ValidTypes { get; set; }
public FileTypeAttribute(string validTypes)
{
_ValidTypes = validTypes.Split(',').Select(s => s.Trim().ToLower());
ErrorMessage = string.Format(_DefaultErrorMessage, string.Join(" or ", _ValidTypes));
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
IEnumerable<HttpPostedFileBase> files = value as IEnumerable<HttpPostedFileBase>;
if (files != null)
{
foreach(HttpPostedFileBase file in files)
{
if (file != null && !_ValidTypes.Any(e => file.FileName.EndsWith(e)))
{
return new ValidationResult(ErrorMessageString);
}
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "filetype",
ErrorMessage = ErrorMessageString
};
rule.ValidationParameters.Add("validtypes", string.Join(",", _ValidTypes));
yield return rule;
}
}
[FileType("JPG,JPEG,PNG")]
public IEnumerable<HttpPostedFileBase> Attachments { get; set; }
@Html.TextBoxFor(m => m.Attachments, new { type = "file", multiple = "multiple" })
@Html.ValidationMessageFor(m => m.Attachments)
jquery.validate.js
和
jquery.validate.unobtrusive.js
一起使用)
$.validator.unobtrusive.adapters.add('filetype', ['validtypes'], function (options) {
options.rules['filetype'] = { validtypes: options.params.validtypes.split(',') };
options.messages['filetype'] = options.message;
});
$.validator.addMethod("filetype", function (value, element, param) {
for (var i = 0; i < element.files.length; i++) {
var extension = getFileExtension(element.files[i].name);
if ($.inArray(extension, param.validtypes) === -1) {
return false;
}
}
return true;
});
function getFileExtension(fileName) {
if (/[.]/.exec(fileName)) {
return /[^.]+$/.exec(fileName)[0].toLowerCase();
}
return null;
}
关于asp.net-mvc-4 - 如何在 Asp.Net MVC 4 中验证 HttpPostedFileBase 属性的文件类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40199870/
在我的 MVC 代码中,我得到了一个 httppostedfilebase 类型的图像。我的 SQL 数据库中有相应的图像类型列。 我需要知道如何在我的数据库中将此 httppostedfilebas
在我的 MVC 代码中,我得到了一个 httppostedfilebase 类型的图像。我的 SQL 数据库中有相应的图像类型列。 我需要知道如何在我的数据库中将此 httppostedfilebas
我有一个单元测试,我正在模拟 HttpPostedFileBase 文件并将它们放在列表中。单元测试然后像这样调用邮件服务(不相关的参数,如 to、from、subject 被忽略) [Test] p
我正在尝试使用 MVC 实现上传附件功能。我实际执行上传/保存附件的方法需要 HttpPostedFileBase 类型。 public virtual string Upload(HttpPoste
我有 Kendo ThemeBuilder,在 MVC C# 中创建一个主题,因为我有一个模型,其中包含从 themebuilder 返回的 css body 要将它保存到 css 文件,我可以通过创
我在 HttpPostedFileBase 上遇到错误: The type or namespace name 'HttpPostedFileBase'could not be found(are y
我在带有 CSLA 的分布式环境中使用 MVC .NET,我可以从我的网络层之一(例如 Website.MVC)引用 HttpPostedFileBase,但我不能从单独的层(我们称之为 OtherL
在我的Create View中我有 @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl, FormMethod.Post, encty
我正在使用 ASP.NET MVC,并且我有一个上传文件的操作。文件正在正确上传。但我想要图像的宽度和高度。我想我需要先将 HttpPostedFileBase 转换为 Image 然后继续。我该怎么
在我的Create View 我有 @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl, FormMethod.Post, encty
我的客户端javascript代码是 function SendMail() { debugger; var decpr = tinyMCE.get('taskdesc
我正在开发一个 ASP.NET MVC 4 应用程序,在许多 View 中用户可以上传我保存在服务器上的文件。除此之外,我还有一个单独的实体,用于保存上传文件的不同数据,例如: string fi
如果我禁用客户端验证 并尝试上传一个大约 11 MB 的文件,将文件设置为 HttpPostedFileBase memeber [ValidateFile] public Htt
我正在使用 C# 开发一个 ASP.NET MVC 项目,试图将文档从表单上传到我的数据库。我目前在我的 Controller 中,我已将文件导入为 HttpPostedFileBase,并且必须将其
有没有一种简单的方法可以从 HttpPostedFileBase 中获取 FileInfo 对象?我意识到我可以保存文件,然后执行类似 DirectoryInfo.GetFiles 的操作,然后循环遍
那么,场景是这样的:用户上传文件,我的代码将此文件转换为字节数组,然后将该数组传递给外部 API。这很好用。 问题是这个文件包含了像æ,ø,å这样的特殊字符,当byte[]再次转换成字符时,这些字符被
我无法弄清楚我做错了什么,但由于某种原因 HttpPostedFileBase 总是返回 null。当我尝试在服务器端上传文件时,我继续使用 HttpPosterFileBase 获取 null:这是
我正在尝试创建一种方法,我可以在其中传递图像文件并检索该图像文件的字节,以便稍后我可以将字节存储在数据库中。这是我的方法代码。 private byte[] GetImageBytes(HttpPos
我正在尝试在 ASP.NET MVC 中上传单个 .csv 文件。在我的 .ascx 文件中,我有:  
我必须使用具有如下方法的网络服务: SubmitUser(UserReg user, HttpPostedFileBase image) { // webservice side process
我是一名优秀的程序员,十分优秀!