如何在asp.net上传之前检查文件类型?

在使用asp.net&c# 上传文件类型之前,如何在不使用文件扩展名的情况下检查文件类型(jpg等格式)?

我正在使用vs 2008 + asp.net + c#+ TELERIK Controls(RadUpload)


想象一些正文将文本文件扩展名更改为jpg并在上传控件中选择它,例如radupload …

我们怎么能认识到这个文件真的是jpg?

例:

// generate new Guid Guid fileguid = Guid.NewGuid(); // set limit for images, 1920x1200 pixels int imageWidth = 1920; int imageHeight = 1200; int maxFileSize = 8388608; // web.config - httpRuntime - maxRequestLength="8192" // 8,388,608 Bytes // 8,192 KB ( / 1024 ) // 8.00 MB ( / 1024 / 1024 ) string sConn = ConfigurationManager.ConnectionStrings["AssetsDBCS"].ConnectionString; SqlConnection objConn = new SqlConnection(sConn); objConn.Open(); SqlCommand objCmd = new SqlCommand("sp_FileStorage_New", objConn); objCmd.CommandType = CommandType.StoredProcedure; SqlParameter paramFileGuid = objCmd.Parameters.Add("@FileGuid", SqlDbType.UniqueIdentifier); SqlParameter paramFileSubject = objCmd.Parameters.Add("@Subject", SqlDbType.VarChar); SqlParameter paramFileContentType = objCmd.Parameters.Add("@ContentType", SqlDbType.VarChar); SqlParameter paramFileData = objCmd.Parameters.Add("@BinaryData", SqlDbType.VarBinary); SqlParameter paramFileSize = objCmd.Parameters.Add("@Filesize", SqlDbType.BigInt); SqlParameter paramFileDesc = objCmd.Parameters.Add("@Description", SqlDbType.VarChar); SqlParameter paramIsSLAFile = objCmd.Parameters.Add("@IsSLAFile", SqlDbType.Bit); SqlParameter paramUserStamp = objCmd.Parameters.Add("@UserStamp", SqlDbType.VarChar); paramFileGuid.Direction = ParameterDirection.Input; paramFileSubject.Direction = ParameterDirection.Input; paramFileContentType.Direction = ParameterDirection.Input; paramFileData.Direction = ParameterDirection.Input; paramFileSize.Direction = ParameterDirection.Input; paramFileDesc.Direction = ParameterDirection.Input; paramIsSLAFile.Direction = ParameterDirection.Input; paramUserStamp.Direction = ParameterDirection.Input; // read data byte[] bData = new byte[fuOne.PostedFile.ContentLength]; Stream objStream = fuOne.PostedFile.InputStream; objStream.Read(bData, 0, fuOne.PostedFile.ContentLength); paramFileSubject.Value = txtSubject.Text; objCmd.Parameters.Add("@FileName", SqlDbType.VarChar).Value = Path.GetFileName(fuOne.PostedFile.FileName); objCmd.Parameters.Add("@Extension", SqlDbType.VarChar).Value = Path.GetExtension(fuOne.PostedFile.FileName); paramFileGuid.Value = fileguid; paramFileContentType.Value = fuOne.PostedFile.ContentType; paramFileData.Value = bData; paramFileSize.Value = fuOne.PostedFile.ContentLength; paramFileDesc.Value = fuOne.PostedFile.FileName; paramIsSLAFile.Value = cbIsSLAFile.Checked; paramUserStamp.Value = ac.getUser(); if (fuOne.PostedFile.ContentLength < maxFileSize) { switch (fuOne.PostedFile.ContentType) { case "image/pjpeg": { System.Drawing.Image iImage = System.Drawing.Image.FromStream(new MemoryStream(bData)); if (iImage.Width > imageWidth || iImage.Height > imageHeight) { lblStatus.Text = "The image width or height cannot be greater than " + imageHeight + " x " + imageWidth + " pixels"; } else { objCmd.ExecuteNonQuery(); objConn.Close(); hlDownload.Visible = true; hlDownload.NavigateUrl = "Download.aspx?DownloadFileGuid=" + fileguid.ToString(); hlDownload.Text = "Click here to download the uploaded file"; hlShowFile.Visible = true; hlShowFile.NavigateUrl = "Download.aspx?ShowFileGuid=" + fileguid.ToString(); hlShowFile.Text = "Click here to view the uploaded file"; lblStatus.Text = showUploadFileInfo(Path.GetFileName(fuOne.PostedFile.FileName), fuOne.PostedFile.ContentType, fuOne.PostedFile.ContentLength, iImage.Width, iImage.Height); } break; } } } 

在上传之前,你唯一要做的就是名字。 所以你不能。 你可以上传它,检查文件的内容,如果它不是你想要的,删除它。

Telerik允许您使用’AllowedFileExtensions’属性进行客户端validation:

  

但是,除了服务器端之外,您无法检查文件的内容类型。

迈克尔

您永远不应该依赖文件扩展名来确定文件的内容。 请记住,扩展名可以重命名为任何内容。

确定文件类型的唯一方法是查看文件本身。 你不能轻易在客户端上做到这一点。 您必须允许将文件上载到隔离目录,然后在将文件移动到其最终受信任位置之前在服务器上的该目录中检查它。

在任何情况下,您都应该对病毒进行病毒扫描。

如果不运行Java Applet,Flash等客户端应用程序,则无法在上载之前检查文件。 这就是大多数图像托管/编辑网站(如ShutteryFly等)使用具有文件系统权限的浏览器插件的原因。