属性:
FileName: 获取上传的文件名
HasFile: 是否选择(存在)上传的文件
ContentLength: 获得上窜文件的大小,单位是字节(byte)
方法:
Server.MapPath(): 获取服务器上的物理路径
SaveAs(): 保存文件到指定的文件夹
注意:默认情况下限制上传文件大小为4MB,通过web.config.comments(这个设置是全局的配置)可以修改其默认设置
或者通过修改web.config文件来改变应用程序上传限制.
如:
1
|
< httpRuntime maxRequestLength = "10240" executionTimeout = "150" enable = "true" />
|
元素解释:
maxRequestLength: 设置上传文件大小,单位是kb.
executionTimeout: 允许执行请求的最大秒数,此功能必须在Compilation元素中Debug属性为false时才生效.
enable: 指定是否在当前的节点及子节点级别启用应用程序域 (AppDomain),以接受传入的请求。如果为 False,则实际上关闭了该应用程序。默认值为 True.
通俗的说就是:是否允许用户访问该网站(是否允许Http请求)
注意:如果上传文件超过maxRequestLength大小,会出现页面无法显示的情况.
如:
2).服务器端检查
示例:
界面参考:
代码如下 |
复制代码 |
function checkType(){
//得到上传文件的值
var fileName=document.getElementById("FileUpLoad1").value;
//返回String对象中子字符串最后出现的位置.
var seat=fileName.lastIndexOf(".");
//返回位于String对象中指定位置的子字符串并转换为小写.
var extension=fileName.substring(seat).toLowerCase();
//判断允许上传的文件格式
//if(extension!=".jpg"&&extension!=".jpeg"&&extension!=".gif"&&extension!=".png"&&extension!=".bmp"){
//alert("不支持"+extension+"文件的上传!");
//return false;
//}else{
//return true;
//}
var allowed=[".jpg",".gif",".png",".bmp",".jpeg"];
for(var i=0;i
if(!(allowed[i]!=extension)){
return true;
}
}
alert("不支持"+extension+"格式");
return false;
}
|
.aspx.cs:
代码如下 |
复制代码 |
//文件上传按钮click事件
protected void btnFileUpload_Click(object sender, EventArgs e)
{
if (FileUpLoad1.HasFile)
{
//判断文件是否小于10Mb
if (FileUpLoad1.PostedFile.ContentLength < 10485760)
{
try
{
//上传文件并指定上传目录的路径
FileUpLoad1.PostedFile.SaveAs(Server.MapPath("~/Files/")
+ FileUpLoad1.FileName);
/*注意->这里为什么不是:FileUpLoad1.PostedFile.FileName
* 而是:FileUpLoad1.FileName?
* 前者是获得客户端完整限定(客户端完整路径)名称
* 后者FileUpLoad1.FileName只获得文件名.
*/
//当然上传语句也可以这样写(貌似废话):
//FileUpLoad1.SaveAs(@"D:"+FileUpLoad1.FileName);
lblMessage.Text = "上传成功!";
}
catch (Exception ex)
{
lblMessage.Text = "出现异常,无法上传!";
//lblMessage.Text += ex.Message;
}
}
else
{
lblMessage.Text = "上传文件不能大于10MB!";
}
}
else
{
lblMessage.Text = "尚未选择文件!";
}
}
|
服务器端检查两种方式:
1.检查文件的扩展名.
2.读取文件的二进制.
检查文件的扩展名:
代码如下 |
复制代码 |
//判断是否有上传文件
if (FileUpload1.HasFile)
{
//截取要上传文件的扩展名
//string extension = FileUpload1.FileName
.Substring(FileUpload1.FileName.LastIndexOf(".")).ToLower();
string extension = System.IO.Path
.GetExtension(FileUpload1.FileName).ToLower();
//上传文件是否大于10MB
if (FileUpload1.PostedFile.ContentLength < 10485760)
{
//设置支持上传的文件格式
string[] allowedextension =
{ ".jpg", ".gif", ".jpeg", ".bmp", ".png" };
for (int i = 0; i < allowedextension.Length; i++)
{
//判断上传文件扩展名是否正确
if (!(extension != allowedextension[i]))
{
try
{
//上传文件
FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/")+ FileUpload1.FileName);
lblMessage.Text = "文件上传成功!";
break;
}
catch (Exception ex)
{
lblMessage.Text = "出现错误,无法上传!";
}
}
else
{
lblMessage.Text = "不支持" + extension + "格式的文件!";
}
}
}
else
{
lblMessage.Text = "上传文件大小不能超过10MB!";
}
}
else
{
lblMessage.Text = "不存在上传文件!";
} |
以上例子做法的弊端,假设上传文件是.wma文件,把扩展名改成.jpg文件那么将不能被识别,依然能够上传.
解决方法:通过读取文件的二进制,每种文件的二进制前面两个字节都是不一样的,不同的文件扩展名它的
二进制前面两个字节是不同的.我们可以通过这种方式来检测文件的扩展名.如:.jpg文件前两个字节是:255216
.gif文件前两个字节是:7173,6677是BMP,13780是PNG;7790是exe,8297是rar.
上传文件名相同,文件将被覆盖,我们要对文件名的唯一性处理该怎么办呢?
上传文件名唯一性的处理:
1.利用时间戳
2.利用GUID(全局统一标识符)
读取文件的二进制并且对文件名的唯一性做处理:
代码如下 |
复制代码 |
protected void btnUpLoad_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
//判断文件大小是否大于10MB
if (FileUpload1.PostedFile.ContentLength < 10485760)
{
if (CheckFileType())
{
try
{
/*使用时间戳精确到毫秒,SessionID,上传文件大小,
5位随机数,来做上传文件名唯一性的处理*/
/* Random rd = new Random();
String fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff")+
rd.Next(10000,99999)+
Session.SessionID +
FileUpload1.PostedFile.ContentLength +
System.IO.Path.GetExtension(FileUpload1.FileName);*/
/*如果使用时间戳还觉得不够保险,需要绝对唯一
*那么可以使用GUID(全局的唯一标示符):*/
string fileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(FileUpload1.FileName);
FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/") + fileName);
lblMessage.Text = "上传文件成功!";
}
catch (Exception)
{
lblMessage.Text = "出现异常无法上传!";
}
}
else
{
lblMessage.Text = "不支持此文件格式!";
}
}
else
{
lblMessage.Text = "文件大小不能超过10MB";
}
}
else
{
lblMessage.Text = "文件不存在,请选择文件!";
}
}
//通过读取文件二进制的前两个字节判断文件的类型
private bool CheckFileType()
{
//得到客户端文件的绝对路径
String file=FileUpload1.PostedFile.FileName;
//创建文件流.
System.IO.FileStream fs = new System.IO.FileStream(file,System.IO.FileMode.Open,System.IO.FileAccess.Read);
//创建读取文件二进制的对象
System.IO.BinaryReader br=new System.IO.BinaryReader(fs);
string fileType=String.Empty;
//读取文件的第一个字节,并将读取位置提升一个字节.
fileType = br.ReadByte().ToString();
//读取第二个字节,并将读取位置提升一个字节.
fileType += br.ReadByte().ToString();
/*如果不知道文件的二进制前两个字节,可以将它打印出来:
* Response.Write(fileBinary);
*/
//允许上传文件的扩展名
String[] allowtedExtension = {"255216", "7173", "6677"};
//判断是否允许上传的文件类型
foreach (string allowEx in allowtedExtension)
{
if (!(allowEx != fileType))
{
return true;
}
}
return false;
}
|