///程序页面
public class ProcessUpload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//1.获取用户上传的文件
if (context.Request.Files.Count > 0)
{
//获取第一个文件域中上传上来的文件
HttpPostedFile fileData = context.Request.Files[0];
//判断上传上来的文件字节数是否大于0
if (fileData.ContentLength > 0)
{
string ext = Path.GetExtension(fileData.FileName);
if ((ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".bmp") && fileData.ContentType.ToLower().StartsWith("image"))
{
#region 计算文件名称和目录,保存文件
//通过guid+旧文件名,计算得到一个新的文件名
string new_fileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(fileData.FileName);
//获取当前new_fileName的哈希码,就是一个整数。
int hash_code = new_fileName.GetHashCode();
//2.使用该整数和二进制值"1111"(也就是16进制值:0xf)与,获取当前整数的最后4为值。
int dir1 = hash_code & 0xf;//第一层目录
//任何类都是继承自object类。object类中有一个方法GetHashCode(),获取当前对象的哈希码。
//将原始的hash_code值向右移动4位。、
hash_code = hash_code >> 4;
int dir2 = hash_code & 0xf;//得到了第二层目录
//路径拼接
string targetFilePath = Path.Combine(context.Request.MapPath("upload/"), dir1.ToString(), dir2.ToString());
//判断当前文件夹是否存在,如果不存在则创建文件夹
if (!Directory.Exists(targetFilePath))
{
Directory.CreateDirectory(targetFilePath);
}
//2.将用户上传的文件另存为到服务器的目录下。
//将文件名与目录拼接。
targetFilePath = Path.Combine(targetFilePath, new_fileName);
fileData.SaveAs(targetFilePath);
#endregion
context.Response.Write("文件上传成功!");
}
else
{
context.Response.Write("非法的文件!");
}
}
}
}
*******************************************
html页面
<!-- 通过一般处理程序实现下载!-->
<ul>
<li><a href="ProcessDownload.ashx?filename=1.cs">1.cs</a></li>
<li><a href="ProcessDownload.ashx?filename=2.xls">2.xls</a></li>
<li><a href="ProcessDownload.ashx?filename=3.gif">3.gif</a></li>
<li><a href="ProcessDownload.ashx?filename=5.txt">5.txt</a></li>
<li><a href="ProcessDownload.ashx?filename=六六六.zip">六六六.zip</a></li>
<li><a href="ProcessDownload.ashx?filename=7.exe">7.exe</a></li>
<li><a href="ProcessDownload.ashx?filename=8.pdf">8.pdf</a></li>
</ul>