我希望通过文件扩展名验证文件上传器是否有效。如果文件扩展名不等于 .jpg、.jpeg、.gif、.png、.bmp,则抛出验证错误。
是否有一种方法可以在不循环遍历每种类型的情况下完成此操作?
我希望通过文件扩展名验证文件上传器是否有效。如果文件扩展名不等于 .jpg、.jpeg、.gif、.png、.bmp,则抛出验证错误。
是否有一种方法可以在不循环遍历每种类型的情况下完成此操作?
只需建立一个集合 - 如果它很小,那么几乎任何一种集合都可以:
// Build the collection once (you may want a static readonly variable, for
// example).
List<string> list = new List<string> { ".jpg", ".jpeg", ".gif", ".bmp", ... };
// Later
if (list.Contains(extension))
{
...
}
当然,这会循环遍历所有值-但是对于小的集合来说,那不应该太昂贵。对于一个大的字符串集合,您应该使用类似HashSet<string>
的东西,它提供了更有效的查找。
!Regex.IsMatch(extension, "^\.(jpg|jpeg|gif|png|bmp)$")
,但内部仍然会循环。这将需要一个循环,但是您可以使用LINQ(隐藏循环)来完成此操作。
例如:
using System.Linq;
private readonly string[] _matches = new[] { ".jpg", ".bmp", ".png", ".gif", ".bmp" };
// Assumes extension is in the format ".jpg", "bmp", so trim the
// whitespace from start and end
public bool IsMatch(string extension)
{
return _matches.Contains(extension);
}
public static bool In<T>(this T t, IEnumerable<T> enumerable)
{
foreach (T item in enumerable)
{
if (item.Equals(t))
{ return true; }
}
return false;
}
public static bool In<T>(this T t, params T[] items)
{
foreach (T item in items)
{
if (item.Equals(t))
{ return true; }
}
return false;
}
当然,它仍需要一个循环,但好的是你不必自己写。这也意味着你不必编写像这样的代码:
if (myString == "val1" ||
myString == "val2" ||
myString == "val3" ||
myString == "val4" ||
myString == "val5")
{
//Do something
}
正则表达式。
string fx = "jpg";
if (!Regex.IsMatch(fx, "^\.?(jpg|jpeg|gif|png|bmp)$", RegexOptions.IgnoreCase))
{
}
另外,要获取文件扩展名,请使用
string fn= file.FileName;
if (fn.Contains("\\"))
fn= fn.Substring(fn.LastIndexOf("\\") + 1);
string fx = fn.Substring(0, fn.LastIndexOf('.'));
FileSystemInfo
,不妨使用Path.GetExtension(pathstring)
。这样做更加简洁。 - Firo您可以使用switch语句来验证文件扩展名:
protected bool IsValidExtension(string extension)
{
switch (extension.ToLower())
{
case ".jpg":
case ".jpeg":
case ".gif":
case ".png":
case ".bmp":
return true;
default:
return false;
}
}