在网上搜索了一下,发现以jquery+ajax方式实现单张图片上传的代码是有的,但实现批量上传图片的程序却没搜索到,于是根据搜索到的代码,写了一个可以批量上传的。
先看效果图

点击增加按钮,会增加一个选择框,如下图:



选择要上传的图片,效果图如下:

上传成功如下图:

下面来看代码:
前台html主要代码:

< 
  button  
  id 
  ="SubUpload" 
   class 
  ="ManagerButton" 
   onClick 
  ="TSubmitUploadImageFile();return false;" 
  > 
  确定上传 
  </ 
  button 
  > 
     
  
 
  < 
  button  
  id 
  ="CancelUpload" 
   class 
  ="ManagerButton" 
   onClick 
  ="javascript:history.go(-1);" 
  > 
  取消 
  </ 
  button 
  > 
     
  
 
  < 
  button  
  id 
  ="AddUpload" 
   class 
  ="ManagerButton" 
   onClick 
  ="TAddFileUpload();return false;" 
  > 
  增加 
  </ 
  button 
  > 
  
 
  < 
  tr 
  >< 
  td  
  class 
  ="tdClass" 
  > 
  
图片1:
 
  </ 
  td 
  >< 
  td  
  class 
  ="tdClass" 
  > 
  
 
  < 
  input  
  name 
  ="" 
   size 
  ="60" 
   id 
  ="uploadImg1" 
   type 
  ="file" 
    
  /> 
  
 
  < 
  span  
  id 
  ="uploadImgState1" 
  ></ 
  span 
  > 
  
 
  </ 
  td 
  ></ 
  tr 
  >


 

因为用了JQuery,所以你完全可以把click事件放在js文件中
“增加”按钮js代码:


var 
   TfileUploadNum 
  = 
  1 
  ;  
  // 
  记录图片选择框个数 
  
 
  var 
   Tnum 
  = 
  1 
  ;  
  // 
  ajax上传图片时索引 
  
 
  function 
   TAddFileUpload()
{
 
  var 
   idnum  
  = 
   TfileUploadNum 
  + 
  1 
  ;
 
  var 
   str 
  = 
  " 
  <tr><td class=’tdClass’>图片 
  " 
  + 
  idnum 
  + 
  " 
  :</td> 
  " 
  ;
str  
  += 
    
  " 
  <td class=’tdClass’><input name=’’ size=’60’ id=’uploadImg 
  " 
  + 
  idnum 
  + 
  " 
  ’ type=’file’ /><span id=’uploadImgState 
  " 
  + 
  idnum 
  + 
  " 
  ’> 
  " 
  ;
str  
  += 
    
  " 
  </span></td></tr> 
  " 
  ;
( 
  " 
  #imgTable 
  " 
  ).append(str);
TfileUploadNum  
  += 
    
  1 
  ;
} 
 
“确定上传”按钮js代码:
 
 
function 
   TSubmitUploadImageFile()
{
M( 
  " 
  SubUpload 
  " 
  ).disabled 
  = 
  true 
  ;
M( 
  " 
  CancelUpload 
  " 
  ).disabled 
  = 
  true 
  ;
M( 
  " 
  AddUpload 
  " 
  ).disabled 
  = 
  true 
  ;
setTimeout( 
  " 
  TajaxFileUpload() 
  " 
  , 
  1000 
  ); 
  // 
  此为关键代码 
  
 
  } 
 
关于setTimeout("TajaxFileUpload()",1000);这句代码:因为所谓的批量上传,其实还是一个一个的上传,给用户的只是一个假象。只所以要延时执行TajaxFileUpload(),是因为在把图片上传到服务器上时,我在后台给图片重新命名了,命名的规则是,如下代码:
 
 
Random rd  
  = 
    
  new 
   Random();
StringBuilder serial  
  = 
    
  new 
   StringBuilder();
serial.Append(DateTime.Now.ToString( 
  " 
  yyyyMMddHHmmssff 
  " 
  ));
serial.Append(rd.Next( 
  0 
  ,  
  999999 
  ).ToString());
 
  return 
   serial.ToString();


即使我命名精确到毫秒,另外再加上随机数,可是还是有上传的第二张图片把上传的第一张图片覆盖的情况出现。所以此处我设置了延时1秒后在上传下一张图片。刚开始做这个东西的时候,用的是for循环,来把所有的图片一个一个的循环地用ajax上传,可是for循环速度太快了,可能第一张图片还没来得及ajax,第二张就被for过来了,还是有第二张覆盖第一张的情况出现。
下面来看TajaxFileUpload()函数,代码如下:

function 
   TajaxFileUpload()
{
 
  if 
  (Tnum 
  < 
  TfileUploadNum 
  + 
  1 
  )
{
 
  // 
  准备提交处理 
  
 
  ( 
  " 
  #uploadImgState 
  " 
  + 
  Tnum).html( 
  " 
  <img src=../images/loading.gif /> 
  " 
  );
 
  // 
  开始提交 
  
 
  .ajax
({
type:  
  " 
  POST 
  " 
  ,
url: 
  " 
  http://localhost/ajaxText2/Handler1.ashx 
  " 
  ,
data:{upfile:( 
  " 
  #uploadImg 
  " 
  + 
  Tnum).val(),category:( 
  " 
  #pcategory 
  " 
  ).val()},
success: 
  function 
   (data, status)
{
 
  // 
  alert(data); 
  
 
  var 
   stringArray  
  = 
   data.split( 
  " 
  | 
  " 
  );

 
  if 
  (stringArray[ 
  0 
  ] 
  == 
  " 
  1 
  " 
  )
{
 
  // 
  stringArray[0] 成功状态(1为成功,0为失败) 
  
// 
  stringArray[1] 上传成功的文件名 
  
// 
  stringArray[2] 消息提示 
  
 
  ( 
  " 
  #uploadImgState 
  " 
  + 
  Tnum).html( 
  " 
  <img src=../images/note_ok.gif /> 
  " 
  ); 
  // 
  +stringArray[1]+"|"+stringArray[2]); 
  
 
  } 
 
  else 
  
{
 
  // 
  上传出错 
  
 
  ( 
  " 
  #uploadImgState 
  " 
  + 
  Tnum).html( 
  " 
  <img src=../images/note_error.gif /> 
  " 
  + 
  stringArray[ 
  2 
  ]); 
  // 
  +stringArray[2]+""); 
  
 
  }
Tnum 
  ++ 
  ;
setTimeout( 
  " 
  TSubmitUploadImageFile() 
  " 
  , 
  0 
  );
}
}); 
}
} 
 
上面的代码没什么可说的,很容易看懂。下面来看Handler1.ashx(一般处理程序)如何来处理post过来的图片的(此代码来自网上,具体地址忘记了),下面只给出关键代码,全部代码在附件里。
1、 
 
string 
   _fileNamePath  
  = 
    
  "" 
  ;
 
  try 
  
{
_fileNamePath  
  = 
   context.Request.Form[ 
  " 
  upfile 
  " 
  ];
 
  // 
  开始上传 
  
 
  string 
   _savedFileResult  
  = 
   UpLoadFile(_fileNamePath);
context.Response.Write(_savedFileResult);
}
 
  catch 
  
{
context.Response.Write( 
  " 
  0|error|上传提交出错 
  " 
  );
}  
 
2、
 
 
Code
 
  // 
  生成将要保存的随机文件名 
  
 
  string 
   fileName  
  = 
   GetFileName()  
  + 
   fileNameExt;
 
  // 
  物理完整路径  
  
 
  string 
   toFileFullPath  
  = 
   HttpContext.Current.Server.MapPath(toFilePath);
 
  // 
  检查是否有该路径 没有就创建 
  
 
  if 
   ( 
  ! 
  Directory.Exists(toFileFullPath))
{
Directory.CreateDirectory(toFileFullPath);
}
 
  /// 
  创建WebClient实例  
  
 
  WebClient myWebClient  
  = 
    
  new 
   WebClient();
 
  // 
  设定windows网络安全认证 方法1 
  
 
  myWebClient.Credentials  
  = 
   CredentialCache.DefaultCredentials;
 
  // 
  要上传的文件  
  
 
  FileStream fs  
  = 
    
  new 
   FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
 
  // 
  FileStream fs = OpenFile();  
  
 
  BinaryReader r  
  = 
    
  new 
   BinaryReader(fs);
 
  // 
  使用UploadFile方法可以用下面的格式 
 
  // 
  myWebClient.UploadFile(toFile, "PUT",fileNamePath);  
  
 
  byte 
  [] postArray  
  = 
   r.ReadBytes(( 
  int 
  )fs.Length);
Stream postStream  
  = 
   myWebClient.OpenWrite(toFile,  
  " 
  PUT 
  " 
  );
 
  if 
   (postStream.CanWrite)
{
postStream.Write(postArray,  
  0 
  , postArray.Length);
} 
 
 
3、检查是否合法的上传文件
 
 
private 
    
  bool 
   CheckFileExt( 
  string 
   _fileExt)
{
 
  string 
  [] allowExt  
  = 
    
  new 
    
  string 
  [] {  
  " 
  .gif 
  " 
  ,  
  " 
  .jpg 
  " 
  ,  
  " 
  .jpeg 
  " 
   };
 
  for 
   ( 
  int 
   i  
  = 
    
  0 
  ; i  
  < 
   allowExt.Length; i 
  ++ 
  )
{
 
  if 
   (allowExt[i]  
  == 
   _fileExt) {  
  return 
    
  true 
  ; }
}
 
  return 
    
  false 
  ;
}

 
 
4、生成要保存的随即文件名 
 
 
public 
    
  static 
    
  string 
   GetFileName()
{
Random rd  
  = 
    
  new 
   Random();
StringBuilder serial  
  = 
    
  new 
   StringBuilder();
serial.Append(DateTime.Now.ToString( 
  " 
  yyyyMMddHHmmssff 
  " 
  ));
serial.Append(rd.Next( 
  0 
  ,  
  999999 
  ).ToString());
 
  return 
   serial.ToString();
}

 

Ok,基本上这个批量上传图片的JQuery+ajax方式实现的程序完成了。如果你要上传word文档,pdf文件,只要稍作修改,就可以实现了。