我正在使用FileUpload控件来方便在我的网站上上传图片文件。 我想限制用户只上载图像文件。 我正在使用asp.net中的文件上传
if (fupFirmLogo.PostedFile.ContentType == "image/Jpeg")
{
}
检查文件是否为图像。我想要允许所有图像扩展名,如PNG,GiF,Jpeg,tif,BMP等。我应该怎么做。
我正在使用FileUpload控件来方便在我的网站上上传图片文件。 我想限制用户只上载图像文件。 我正在使用asp.net中的文件上传
if (fupFirmLogo.PostedFile.ContentType == "image/Jpeg")
{
}
检查文件是否为图像。我想要允许所有图像扩展名,如PNG,GiF,Jpeg,tif,BMP等。我应该怎么做。
你应该使用正则表达式来验证是图像或没有,可能是更好的选择
像一些事情:
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
}
你可以定义一组已知图像类型:
public static readonly string[] _imageMimeTypes = new[] { "image/jpeg", "image/png" };
,然后测试发表的内容类型是否是这个数组中:
if (_imageMimeTypes.Contains(fupFirmLogo.PostedFile.ContentType))
{
// ...
}
达林,我认为结合你的想法和anishMarokey's是最好的选择。检查MIME类型,但是从通用类中这样做,以便它可以重用。这是我们在文件上传控件上使用的方法。 – Tommy 2010-05-28 13:21:28
我希望这将帮助你。尝试下面的代码。
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);
}
}
上述解决方案的唯一问题是该文件必须先上载到服务器,然后才能检查其文件类型。
如果您在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.
}
你仍然有我在这里重命名一个.exe到.jpg问题。这可能会抓住99%的东西,但你仍然需要服务器端验证。另外,那些关闭JS的呢? – Tommy 2010-05-28 13:22:31
然后它仍然会发布文件 - 主要的是虽然大多数情况下这会减少带宽开销。我仍然在上面的Image.FromStream解决方案,但以这种方式开始可以省略很多潜在的问题。 – 2010-05-28 13:37:43
检查,对正则表达式匹配的图像文件的扩展名的文件名是不恰当的。黑客可以使用此功能来宣传他们的网站。我亲身体验过它。所以,这里是你如何使它肯定的是,上传的文件是在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
我知道这是旧的,但只是验证的内容类型。内容类型只是一个字符串。
if (fupFirmLogo.PostedFile.ContentType.Contains("image/")
{
//This is an Image
}
else
{
//not and image
}
这将允许具有内容类型从开始“图像/”,其任何文件是所有图像。
用户无法有意修改文件的扩展名,即从.exe到.jpeg。我认为,这种方法将允许它。 – 2010-05-28 12:17:50
我觉得没有。你怎么能把一个.exe改成.jpg? – anishMarokey 2010-05-28 12:44:08
同意这可能有一个漏洞。尽管我喜欢这个正则表达式。将包括fupFirmLogo.PostedFile.ContentType的正则表达式来检查“^ image /.+$”是否消除了任何漏洞? – Eddie 2010-05-28 12:57:41