C#检测上传文件真正类型的方法
作者:gogo 发布时间:2021-10-28 11:32:59
标签:C#,检测,文件类型
本文实例讲述了C#检测上传文件真正类型的方法。分享给大家供大家参考。具体分析如下:
对于用户上传的文件如果只是根据扩展名判断,很容易上传上来可执行文件,这是非常危险的,这段代码可以在服务器端检测上传文件的真实类型。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Alert(string s)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "js", "alert('" + s + "')", true);
}
protected void Button1_Click(object sender, EventArgs e)
{
saveFile();
}
protected String saveFile()
{
String MaxSize = "1024";
//最大文件大小
int imgMaxSize = Convert.ToInt32(MaxSize) * 1024 * 1024;
HttpPostedFile imgFile = FuImg.PostedFile;
if (imgFile == null || FuImg.FileName == "")
{
Alert("请选择文件。");
return "";
}
String dirPath = Server.MapPath("~/");
string saveUrl = Page.ResolveUrl("~/");
if (!System.IO.Directory.Exists(dirPath))
{
Alert("上传目录不存在。");
return "";
}
String fileName = imgFile.FileName;
String fileExt = System.IO.Path.GetExtension(fileName).ToLower();
if (imgFile.InputStream == null || imgFile.InputStream.Length > imgMaxSize)
{
Alert("上传文件大小超过限制。");
return "";
}
//验证文件格式
String fpath = IsAllowedExtension(imgFile);
if ("" == fpath)
{
Alert("图片格式不正确。");
return "";
}
String ymd = DateTime.Now.ToString("yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo);
dirPath += ymd + "/";
saveUrl = saveUrl + ymd + "/";
//判断目录是否存在
if (!System.IO.Directory.Exists(dirPath))
{
//创建目录
System.IO.Directory.CreateDirectory(dirPath);
}
String newFileName = Guid.NewGuid().ToString() + fileExt;
//图片名字
String filePath = dirPath + newFileName;
System.IO.File.Move(fpath, filePath);
String fileUrl = saveUrl + newFileName;
Img.ImageUrl = fileUrl;
//ImageUrl = saveUrl + newFileName;
return fileUrl;
}
public String IsAllowedExtension(HttpPostedFile f)
{
String newFile = Server.MapPath("~/" + System.Guid.NewGuid().ToString("D") + ".tmp");
f.SaveAs(newFile);
System.IO.FileStream fs = new System.IO.FileStream(newFile, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.BinaryReader r = new System.IO.BinaryReader(fs);
string fileclass = "";
byte buffer;
buffer = r.ReadByte();
fileclass = buffer.ToString();
buffer = r.ReadByte();
fileclass += buffer.ToString();
r.Close();
fs.Close();
/* 文件扩展名说明
*7173 gif
*255216 jpg
*13780 png
*6677 bmp
*/
Dictionary<String, String> ftype = new Dictionary<string, string>();
//添加允许的文件类型
ftype.Add("7173", "gif");
ftype.Add("255216", "jpg");
ftype.Add("13780", "png");
ftype.Add("6677", "bmp");
if (ftype.ContainsKey(fileclass))
{
return newFile;
}
else
{
System.IO.File.Delete(newFile);
return "";
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
</head>
<body>
<form id="form1" runat="server">
<asp:FileUpload ID="FuImg" runat="server" />
<asp:Button ID="Button1" runat="server"
OnClick="Button1_Click" Text="上传测试" />
<asp:Image ID="Img" runat="server" />
</form>
</body>
</html>
希望本文所述对大家的C#程序设计有所帮助。


猜你喜欢
- transferTo(File file)的路径问题今天看到layui的文件上传的控件,就尝试了一下。简单创建了一个SpringMVC项目。
- SpringBoot 集成 activiti 基础环境搭建添加依赖<dependency> <groupId&g
- 今天介绍一下,我在项目开发过程中,实现状态栏和虚拟按键背景颜色变化的方法,实现方式是,通过隐藏系统的状态栏和虚拟按键的背景,实现图片和背景显
- java 中死锁问题的实例详解先看代码在做解释public class DeadLock implements Runnable{ &nbs
- 平时开发中经常遇到的很小的问题,这里记录一下。一般在AndroidManifest.xml中添加了android:windowSoftInp
- 前言这两天面试了一个物联网公司高级研发,面试题是下面这样子公司领导,部门主管,小组组长,组成员4级,假如有个 疫情预警,先通知组人员(对个人
- 第一步:官网(或跟硬件开发WMI的人沟通你需要的接口和参数定义,如果是和硬件开发的人协定WMI接口,直接看第二步)查找你需要的WMI信息;举
- 前言我们会使用git来保存我们项目的配置文件,但是文件中总有一些敏感数据,对于这些敏感数据我们通常需要给它加密,加密通常有两种加密方式,一种
- 本文实例为大家分享了Android调用手机摄像头拍照和录音功能的具体代码,供大家参考,具体内容如下调用摄像头拍照:public class
- 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是
- 本文实例讲述了Spring Bean的初始化和销毁。分享给大家供大家参考,具体如下:一 点睛在开发过程中,经常遇到在Bean使用之前或者之后
- 本文实例讲述了Java基于正则实现的日期校验功能。分享给大家供大家参考,具体如下:private void checkDate() thro
- 本文实例为大家分享了Android使用AIDL方式实现播放音乐的具体代码,供大家参考,具体内容如下思路:① 新建两个APP项目或者Modul
- 本篇文章基于redisson-3.17.6版本源码进行分析一、主从redis架构中分布式锁存在的问题1、线程A从主redis中请求一个分布式
- Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡
- 一、创建线程启动线程—start 方法通过覆写 run 方法创建⼀个线程对象,但线程对象被创建出来并不意味着线程就开始运
- 本文实例为大家分享了android自定义圆形倒计时显示控件的具体代码,供大家参考,具体内容如下先上效果图 - 倒计时结束代码块at
- 获取整个屏幕的宽度的实例Point p = new Point();//获取窗口管理器WindowManager wm = (WindowM
- 本文实例为大家分享了Unity实现VR中在黑板上写字的具体代码,供大家参考,具体内容如下一、工具1.开发用的是Unity 5.6.2版本2.
- Springboot启动不检查JPA的数据源配置1.问题有时我们使用spring boot ,在依赖中配置了spring data jpa的