如何在不使用文件扩展名前检查文件类型(如jpg等格式)上传与asp.net & c#?如何在将文件上传到asp.net之前检查文件类型?
我使用VS 2008 + asp.net + C#+ Telerik控制(RadUpload)
想象,一些机构更改文本文件扩展名JPG,并在上传conrol选择它如radupload。 ..
我们怎样才能认识到这个文件是真正的jpg或不?
如何在不使用文件扩展名前检查文件类型(如jpg等格式)上传与asp.net & c#?如何在将文件上传到asp.net之前检查文件类型?
我使用VS 2008 + asp.net + C#+ Telerik控制(RadUpload)
想象,一些机构更改文本文件扩展名JPG,并在上传conrol选择它如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;
}
}
}
(真的真的非常感谢) (你的代码是关于文件上传和我RadUpload测试的contentType ...) (但这样做,当u更改文本文件扩展名JPG所以RadUpload想到的是将contentType文件是“图像/ pjpeg”)(我测试) (所以我认为这个问题存在于fileupload ...) (你可以解释一下我们!) – MoonLight 2010-03-14 17:24:40
上传之前,您唯一要做的就是名称。所以你不能。 你可以上传它,检查文件的内容,如果它不是你想要的,删除它。
Telerik的允许你做使用“AllowedFileExtensions”属性的客户端验证:
<telerik:RadUpload ID="RadUpload1"
runat="server"
InitialFileInputsCount="1"
AllowedFileExtensions=".zip,.jpg,.jpeg"
/>
但是除了服务器端,您可以不检查内容类型的文件。
迈克尔
您不能检查不运行的客户端应用,如Java小程序,闪光...等之前上传的文件。这就是大多数图像托管/编辑网站(如ShutteryFly等)使用对您的文件系统具有许可权的浏览器插件的原因。
您不应该依赖文件扩展名来确定文件的内容。请记住,扩展名可以重新命名为任何内容。
确定文件类型的唯一方法是查看文件本身。你不能在客户端轻松做到这一点。您必须允许将文件上传到隔离目录,然后在将文件移动到其最终受信任位置之前,在服务器上的该目录中检查该文件。
在任何情况下,您都应该对这些文件进行病毒扫描。
为什么这个问题有> 1K的看法!?笑 – Nathan 2011-05-15 13:57:44