shawl.qiu c# .net upload class v1.1
没什么好说的, .NET 干这个真太容易了...
这几天在写一个自动化画廊程序, 需要用到上传功能, 就重写了一下先前写的上传类, 使其使用更方便更简洁...
目录:
1. x.aspx
2. cs/upload.cs
下载:
http://files.myopera.com/btbtd/csharp/class/sq_csharp_upload_v1.1.7z
shawl.qiu
2007-02-08
http://blog.csdn.net/btbtd
1. x.aspx
<
%@ Page Language="
C#"
AutoEventWireup="
True" %> <
%@ Assembly src="
cs/upload.cs" %> <!
DOCTYPE html PUBLIC "-//W3C//DTD
XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <
html xmlns="
http://www.w3.org/1999/xhtml"> <
head> <
meta http-equiv="
Content-Type"
content="
text/html; charset=utf-8" /> <
title>shawl.qiu template</
title> </
head> <
body> <
script runat="
server"> void Page_Load(Object s, EventArgs e) { upload
up=new upload(); up.ext="7z,rar,zip,mp3,bmp,gif,jpg,jpeg,png,txt,swf"; up.debug=false; up.item=5; // 声明显示多少个上传框 up.path="/uploads/"; // 上传目录; up.goback_url=Request.Url+""; // 上传完毕后返回的 URL up.goback_second=5; // 上传后返回间隔 up.interval=5; // 每次上传间隔, 单位秒 up.autorename=true; // 自动重命名; //
声明 处理 所有 返回路径 的方法 //
up.ReturnFilePath=new OneArgStringDelegate(GetPath); up.UploadPh=sqUpload; // 声明显示上传控件的占位符 up.UploadBox(); //
显示上传操作控件 up=null; } public void GetPath(String sPath) {
System.Web.HttpContext.Current.Response.Write(sPath); } </
script> <
form runat="
server"> <
asp:PlaceHolder id="
sqUpload"
runat="
server" /> </
form> </
body> </
html>
2. cs/upload.cs
using System; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; public delegate void OneArgStringDelegate(String Str); /*-----------------------------------------------------------------------------------*/
* shawl.qiu c# .net upload class v1.1 /*-----------------------------------------------------------------------------------*/ //
---------------------------------------------------------------------begin class upload public class upload { //
-----------------------------------begin event public upload() { } ~upload() { } //
-----------------------------------end event //
-----------------------------------begin public constant //
-----------------------begin about public const string
auSubject="shawl.qiu c# .net upload class"; public const string
auVersion="v1.1"; public const string
au="shawl.qiu"; public const string
auEmail="shawl.qiu@gmail.com"; public const string
auBlog="http://blog.csdn.net/btbtd"; public const string
auCreateDate="2007-1-30"; public const string
auFirstUpdate="2007-2-8 v1.1"; //
-----------------------end about //
-----------------------------------end public constant //
-----------------------------------begin public variable public Boolean
debug=false; public Boolean
autorename=false; public String
path="/uploads/"; public String
ext="7z,rar,zip,mp3,bmp,gif,jpg,jpeg,png,txt,swf"; public String
goback_url="?"; public Int32
interval=10; public Int32
goback_second=10; public Int32
item=5; public Int32
totalsize=1024*5; public Int32
singlesize=1024; public PlaceHolder UploadPh; public OneArgStringDelegate ReturnFilePath; //
-----------------------------------end public variable //
-----------------------------------begin public method public void UploadBox() {
if(
UploadPh!=null) {
UploadPh.Controls.Add(ErrorLabel);
UploadPh.Controls.Add(GobackLabel);
UploadPh.Controls.Add(UploadDetailsLabel);
InfoLabel=new Label(); InfoLabel.Text="<ul>/n"+ "<li>允许上传的文件类型<b>: "+ext+"</b></li>/n"+ "<li>每次总上传大小最大为 <b>: "+totalsize+"kb</b>, 每文件最大为 <b>"+ singlesize+"kb</b>.</li>/n"+ "<li>每次上传时间间隔为<b>: "+interval+"</b>秒.</li>/n"+ "</ul>";
UploadPh.Controls.Add(InfoLabel);
LiteralBox=new Literal(); LiteralBox.Text="<ol>"; UploadPh.Controls.Add(LiteralBox);
for(Int32
i=0; i<item; i++) {
LiteralBox=new Literal(); LiteralBox.Text="<li>"; UploadPh.Controls.Add(LiteralBox);
UpInputItem = new HtmlInputFile(); UploadPh.Controls.Add(UpInputItem);
LiteralBox=new Literal(); LiteralBox.Text="</li>/n"; UploadPh.Controls.Add(LiteralBox); }
LiteralBox=new Literal(); LiteralBox.Text="</br/>/n"; UploadPh.Controls.Add(LiteralBox);
SubmitButton=new Button(); SubmitButton.Text="Upload now"; SubmitButton.Click+=new EventHandler(go); UploadPh.Controls.Add(SubmitButton);
LiteralBox=new Literal(); LiteralBox.Text=" <input type=/"reset/" value=/"reset/" />"; UploadPh.Controls.Add(LiteralBox);
LiteralBox=new Literal(); LiteralBox.Text="</ol>/n"; UploadPh.Controls.Add(LiteralBox); } } //
end public void UploadBox public void go(Object s, EventArgs e) {
if(HttpContext.Current.Session["sqUpFl"
]==null) { HttpContext.Current.Session["sqUpFl"
]=DateTime.Now; } DateTime
dtSession=DateTime.Parse(HttpContext.Current.Session["sqUpFl"]+"");
if(dtSession>
DateTime.Now) { TimeSpan
hasInterval=dtSession-DateTime.Now; finished("每次上传时间间隔为 "+interval+" 秒, 请稍候...",
hasInterval.Seconds, goback_url, GobackLabel); goto End; } //
---------------------检测上传目录是否存在 String
path_phs=HttpContext.Current.Server.MapPath(path);
if(!
Directory.Exists(path_phs)) { HttpContext.Current.
Response.Write("<h2>指定的上传目录不存在, 操作被取消.</h2>"); goto End; } Int32
upTotal=HttpContext.Current.Request.ContentLength/1024; Int32
total=HttpContext.Current.Request.Files.AllKeys.Length; ArrayList
aUpsize=new ArrayList(); ArrayList
aNoExt=new ArrayList(); ArrayList
aNotAllowExt=new ArrayList(); ArrayList
aFinished=new ArrayList(); if(upTotal>totalsize) goto Upsize;
for(Int32
i=0; i<total; i++) { System.Web.HttpPostedFile
files=HttpContext.Current.Request.Files[i]; if(
files.ContentLength>0) { String
flnm=Path.GetFileName(files.FileName); String
justnm=Path.GetFileNameWithoutExtension(files.FileName); String
justext=Path.GetExtension(files.FileName); String
flph=path+justnm+justext; String
flph_phs=HttpContext.Current.Server.MapPath(flph); //
-----------------------------------单文件超出限制大小 Int32
flSize=files.ContentLength/1024; if(flSize>singlesize) {
aUpsize.Add("文件: "+flnm+", 大小为: "+flSize+" kb."); continue; }
if(!
Path.HasExtension(flnm)) {
aNoExt.Add("文件: "+flnm+", 没有扩展名."); continue; } String
extTemp=Regex.Replace(justext,"^.","");
if(!
Regex.IsMatch(ext, "//b"+extTemp+"//b", RegexOptions.IgnoreCase)) {
aNotAllowExt.Add("不允许上传的文件扩展: "+flnm); continue; }
if(
File.Exists(flph_phs)) //
------------------已存在相同同名文件 {
if(autorename) { Int32
iRename=1; while(
true) { String
sNameTemp=HttpContext.Current. Server.MapPath(path+justnm+"_"+(iRename++)+justext);
if(!
File.Exists(sNameTemp)) {
flph_phs=sNameTemp; goto SaveFile; } //
end if 3 } //
end while } //
end if 2 } //
end if 1 SaveFile:;
files.SaveAs(flph_phs); String
flnmTemp=Path.GetFileName(flph_phs);
aFinished.Add("文件: "+flnmTemp+" 已上传.");
allFilePath+=path+flnmTemp+","; HttpContext.Current.Session["sqUpFl"
]= DateTime.Now.AddSeconds(interval); } //
end if } //
end for goto Report; Upsize:
ErrorLabel.Text+="<h2 style='text-align:center;'>上传大小超出限制, 已被终止.</h2>"; finished(goback_second+" 秒后返回, 还有 ", goback_second, goback_url, GobackLabel); goto End; Report: listAl("已上传文件 ", aFinished, UploadDetailsLabel); listAl("单文件超出限制大小的有 ", aUpsize, UploadDetailsLabel); listAl("没有文件扩展名的有 ", aNoExt, UploadDetailsLabel); listAl("不允许上传的文件扩展有 ", aNotAllowExt, UploadDetailsLabel); goto Finished; Finished: finished("操作已完毕, "+goback_second+" 秒后返回, 还有 ", goback_second, goback_url, GobackLabel); End:
allFilePath=Regex.Replace(allFilePath,",$","");
if(
ReturnFilePath!=null) { ReturnFilePath(allFilePath); } } //
end go //
-----------------------------------end public method //
-----------------------------------begin private variable private String
allFilePath=""; private Label InfoLabel; private Label
GobackLabel=new Label(); private Label
UploadDetailsLabel=new Label(); private Label
ErrorLabel=new Label(); private Literal LiteralBox; private Button SubmitButton; private HtmlInputFile UpInputItem; //
-----------------------------------end private variable //
-----------------------------------begin private method private void listAl(String sDetail, ArrayList oAl, Label UploadDetailsLabel) {
if(
oAl.Count>0) {
UploadDetailsLabel.Text="<ol><label>"+sDetail+"<b>"+ oAl.Count+"个</b>.</label>"; foreach(Object item in oAl) {
UploadDetailsLabel.Text+="<li>"+item+"</li>"; }
UploadDetailsLabel.Text+="</ol><hr/>"; } } private void finished(String sPrompt, Int32 iSecond, String sUrl, Label GobackLabel) {
GobackLabel.Text+="<script type=/"text/javascript/">/n"; GobackLabel.Text+="//<![CDATA[/n"; GobackLabel.Text+=" var temp=onload;/n"; GobackLabel.Text+=" onload=function(){/n"; GobackLabel.Text+=" try{temp()}catch(e){}/n"; GobackLabel.Text+=" fTimer("+iSecond+",'timer', 10);/n"; GobackLabel.Text+=" }/n"; GobackLabel.Text+=" function fTimer(iTimestamp, sId, iMs){/n"; GobackLabel.Text+=" if(!(iTimestamp.constructor==Date)){/n"; GobackLabel.Text+=" var sqTimeStamp=new Date();/n"; GobackLabel.Text+=" sqTimeStamp.setSeconds(sqTimeStamp.getSeconds()+iTimestamp);/n";
GobackLabel.Text+=" iTimestamp=sqTimeStamp;/n"; GobackLabel.Text+=" }/n"; GobackLabel.Text+=" var tl=arguments.callee;/n"; GobackLabel.Text+=" if(typeof sId=='string'){/n"; GobackLabel.Text+=" var oEle=document.getElementById(sId);/n";
GobackLabel.Text+=" } else {/n"; GobackLabel.Text+=" var oEle=sId;/n"; GobackLabel.Text+=" }/n"; GobackLabel.Text+=" var dt=new Date();/n"; GobackLabel.Text+=" var iCk=((iTimestamp.getTime()-dt.getTime())/1000).toFixed(3);/n";
GobackLabel.Text+=" if(iCk<=0){/n"; GobackLabel.Text+=" oEle.innerHTML='00.000';/n"; GobackLabel.Text+=" return false;/n"; GobackLabel.Text+=" } else {/n"; GobackLabel.Text+=" oEle.innerHTML=iCk;/n"; GobackLabel.Text+=" var iTimer=setTimeout(function(){tl(iTimestamp, oEle, iMs)},iMs); /n"; GobackLabel.Text+=" }/n"; GobackLabel.Text+=" } // end function fTimer // shawl.qiu script/n"; GobackLabel.Text+="//]]>/n"; GobackLabel.Text+="</script>/n"; GobackLabel.Text+="<meta http-equiv=/"Content-Type/" content=/"text/html; charset=utf-8/" />"; GobackLabel.Text+="<meta http-equiv=/"refresh/" content=/""+iSecond+";URL="+sUrl+"/">"; GobackLabel.Text+="<div style=/"display:table;width:100%;background-color:yellow!important;"+ "color:black!important;text-align:center!important;/">"+ sPrompt+", <span
id='timer'>"+iSecond+"</span>秒 后返回.</div>"; } //
-----------------------------------end private method } //
---------------------------------------------------------------------end class upload