一、 安全性比較低,把文本文件1.txt改成1.jpg照樣可以上傳,但其實現方法容易理解,實現也簡單,所以網上很多還是采取這種方法。
Boolean fileOk =
false
;
string
path = Server.MapPath(
"~/images/"
);
//判斷是否已經選取文件
if
(FileUpload1.HasFile)
{
//取得文件的擴展名,並轉換成小寫
string
fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
//限定只能上傳jpg和gif圖片
string
[] allowExtension = {
".jpg"
,
".gif"
};
//對上傳的文件的類型進行一個個匹對
int
j = 0;
for
(
int
i = 0; i < allowExtension.Length; i++)
{
if
(fileExtension == allowExtension[i])
{
fileOk =
true
;
return
;
}
else
{
j++;
}
}
if
(j > 0)
{
Response.Write(
"<script>alert('文件格式不正確');</script>"
);
return
;
}
}
else
{
Response.Write(
"<script>alert('你還沒有選擇文件');</script>"
);
return
;
}
//如果擴展名符合條件,則上傳
if
(fileOk)
{
FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
Response.Write(
"<script>alert('上傳成功');</script>"
);
}
二、不檢測文件后綴而是檢測文件MIME內容類型。
Boolean fileOk =
false
;
string
path = Server.MapPath(
"~/images/"
);
//判斷是否已經選取文件
if
(FileUpload1.HasFile)
{
//取得文件MIME內容類型
string
type =
this
.FileUpload1.PostedFile.ContentType.ToLower();
if
(type.Contains(
"image"
))
//圖片的MIME類型為"image/xxx",這里只判斷是否圖片。
{
fileOk =
true
;
}
else
{
Response.Write(
"<script>alert('格式不正確')</script>"
);
}
}
else
{
Response.Write(
"<script>alert('你還沒有選擇文件');</script>"
);
}
//如果擴展名符合條件,則上傳
if
(fileOk)
{
FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
Response.Write(
"<script>alert('上傳成功');</script>"
);
}
三、可以實現真正意義上的文件類型判斷
try
{
//判斷是否已經選取文件
if
(FileUpload1.HasFile)
{
if
(IsAllowedExtension(FileUpload1))
{
string
path = Server.MapPath(
"~/images/"
);
FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
Response.Write(
"<script>alert('上傳成功');</script>"
);
}
else
{
Response.Write(
"<script>alert('您只能上傳jpg或者gif圖片');</script>"
);
}
}
else
{
Response.Write(
"<script>alert('你還沒有選擇文件');</script>"
);
}
}
catch
(Exception error)
{
Response.Write(error.ToString());
}
#endregion
}
//真正判斷文件類型的關鍵函數
public
static
bool
IsAllowedExtension(FileUpload hifile)
{
System.IO.FileStream fs =
new
System.IO.FileStream(hifile.PostedFile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.BinaryReader r =
new
System.IO.BinaryReader(fs);
string
fileclass =
""
;
//這里的位長要具體判斷.
byte
buffer;
try
{
buffer = r.ReadByte();
fileclass = buffer.ToString();
buffer = r.ReadByte();
fileclass += buffer.ToString();
}
catch
{
}
r.Close();
fs.Close();
if
(fileclass ==
"255216"
|| fileclass ==
"7173"
)
//說明255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar
{
return
true
;
}
else
{
return
false
;
}
}