2010-05-28 90 views
2

我正在使用FileUpload控件来方便在我的网站上上传图片文件。 我想限制用户只上载图像文件。 我正在使用asp.net中的文件上传

if (fupFirmLogo.PostedFile.ContentType == "image/Jpeg") 
      { 

      } 

检查文件是否为图像。我想要允许所有图像扩展名,如PNG,GiF,Jpeg,tif,BMP等。我应该怎么做。

回答

1

你应该使用正则表达式来验证是图像或没有,可能是更好的选择

像一些事情:

public static bool IsValidImage(this string fileName) 
    {   
     Regex regex = new Regex(@"(.*?)\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF|bmp|BMP)$"); 
     return regex.IsMatch(fileName); 
    } 

然后你检查:

if (fupFirmLogo.FileName.IsValidImage()) 
{ 
    //Do your code 
} 
else 
{ 
    //Not a valid image 
    } 
+4

用户无法有意修改文件的扩展名,即从.exe到.jpeg。我认为,这种方法将允许它。 – 2010-05-28 12:17:50

+0

我觉得没有。你怎么能把一个.exe改成.jpg? – anishMarokey 2010-05-28 12:44:08

+0

同意这可能有一个漏洞。尽管我喜欢这个正则表达式。将包括fupFirmLogo.PostedFile.ContentType的正则表达式来检查“^ image /.+$”是否消除了任何漏洞? – Eddie 2010-05-28 12:57:41

1

你可以定义一组已知图像类型:

public static readonly string[] _imageMimeTypes = new[] { "image/jpeg", "image/png" }; 

,然后测试发表的内容类型是否是这个数组中:

if (_imageMimeTypes.Contains(fupFirmLogo.PostedFile.ContentType)) 
{ 
    // ... 
} 
+0

达林,我认为结合你的想法和anishMarokey's是最好的选择。检查MIME类型,但是从通用类中这样做,以便它可以重用。这是我们在文件上传控件上使用的方法。 – Tommy 2010-05-28 13:21:28

0

我希望这将帮助你。尝试下面的代码。

Image uploadedImage = null; 
    if (ImageUpload.HasFile && ImageUpload.FileName != string.Empty && ImageUpload.FileContent.Length > 0) 
    { 
     try 
     { 
      uploadedImage = Image.FromStream(ImageUpload.PostedFile.InputStream); 
     } 
     catch (Exception ex) 
     { 
      lblUploadStatus.Text = "Selected file is not an image.<br />" + ex.Message; 
     } 

     if (uploadedImage != null) 
     { 
      string savePath = string.Format("{0}/{1}", Server.MapPath("~/images/orig/upload_temp"), ImageUpload.FileName); 
      uploadedImage.Save(savePath, ImageFormat.Jpeg); 
     } 
    } 
0

上述解决方案的唯一问题是该文件必须先上载到服务器,然后才能检查其文件类型。

如果您在onSubmit调用中添加了一些Javascript,您可以读取文件名并在那里测试,如果它不是有效的文件名,则返回false。

这对你的带宽要友好得多。

<form method="post" enctype="multipart/form-data" onsubmit="return submit(this)"> 
    <input id="inputControl" name="file" type="file" /> 
</form> 

然后

function submit(form) { 
    var fileName = $('#inputControl').val().replace(/.*(\/|\\)/, ''); 
    // check the filename here, return false if its not an image. 
} 
+0

你仍然有我在这里重命名一个.exe到.jpg问题。这可能会抓住99%的东西,但你仍然需要服务器端验证。另外,那些关闭JS的呢? – Tommy 2010-05-28 13:22:31

+0

然后它仍然会发布文件 - 主要的是虽然大多数情况下这会减少带宽开销。我仍然在上面的Image.FromStream解决方案,但以这种方式开始可以省略很多潜在的问题。 – 2010-05-28 13:37:43

0

检查,对正则表达式匹配的图像文件的扩展名的文件名是不恰当的。黑客可以使用此功能来宣传他们的网站。我亲身体验过它。所以,这里是你如何使它肯定的是,上传的文件是在VB.net图像:

Public Function IsFileAnImage(ByRef uploadedFile As HttpPostedFile) As Boolean 
    Try 
     Dim uploadedImage As Drawing.Image = Drawing.Image.FromStream(uploadedFile.InputStream) 
     uploadedImage.Dispose() 
     Return True 
    Catch 
     Return False 
    End Try 
    End Function 
0

我知道这是旧的,但只是验证的内容类型。内容类型只是一个字符串。

if (fupFirmLogo.PostedFile.ContentType.Contains("image/") 
{ 
    //This is an Image 
} 
else 
{ 
    //not and image 
} 

这将允许具有内容类型从开始“图像/”,其任何文件是所有图像。