上传要解决的问题:
1、只能上传体积比较小的文件
2、没有对文件类型和大小进行限制。
3、没有解决重命名问题。
文件上传的限制是ASP.NET的一种保护机制,在Web.config中默认配置maxRequestLength为4MB,它可以限制用户故意通过上传大文件对服务器进行拒绝服务攻击。如果上传时间过长就会发生超时,由executionTimeout参数控制。
我们可以在web.config的<system.web></system.web>之间添加:
<httpRuntime maxRequestLength="40950" executionTimeout="60"/>
这样我们就能上传最大为40M,超时为60秒的文件。
protected void btnUpload_Click(object sender,EventArgs e)
{
if(myFile.HashFile)
{
string strFileName=myFile.FileName;
string strFileExt=System.IO.Path.GetExtension();
if(strFileExt.ToLower()==".rar")
{
string strFileNewName=DateTime.Now.ToString("yyyyMMddhhmmss")+strFileExt;
string strUrl=Request.Url.ToString();
string strFileDownloadPath=strUrl.Substring(0,strUrl.LastIndexOf('/'))+'/'+strFileNewName;
int iFileSize=myFile.PostedFile.ContentLength;
myFile.SaveAs(Server.MapPath(strFileNewName));
Response.Write(string.Format("文件上传成功<br>下载地址:{0}<br>文件大小:{1}字节<br>",strFileDowmloadPath,iFileSize));
}
else
{
Response.Write("系统只能接受.rar文件");
}
}
else
{
Response.Write("请选择您要上传的文件");
}
}
在这里,说明一下几点:
1、System.IO.Path.GetExtension()提供了从指定路径字符串提取文件扩展名的方法,但是因为我们还要考虑扩展名中有大小写的情况,所以在进行比较前我们需要使用ToLower()方法把字符串转换成小写形式再进行比较。
2、SaveAs()方法接受的是文件的物理路径,物理路径就是文件在服务器上实际保存的路径。因此,我们需要使用Server.MapPath()来实现从相对路径到完整物理路径的转换。
3、而用户下载文件的时候需要获取的文件URL不能是物理路径,需要的是对外的Web地址。我们可以从Request.Url属性中获取当前页面的URL地址,然后取出其中不包括页面名的部分再与文件名进行拼接就能得到完整的文件下载地址。
4、为了防止上传的文件重复,我们使用当前的时间对文件进行重命名,对于高并发的系统,我们可以在时间后添加用户名。
对于下载大文件可以参考微软的KnowledgeBase,
http://support,microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B812406