2010-05-28 83 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 
} 

這將允許具有內容類型從開始「圖像/」,其任何文件是所有圖像。