Bestcomy.Web.Controls.Upload 组件支持多文件上传。而且现在以有免费版的了。哈哈。
首先在在WebConfig中设置
<
system
.web
>
< httpModules >
< add name ="UploadModule" type ="Bestcomy.Web.Controls.Upload.UploadModule,Bestcomy.Web.Controls.Upload" />
</ httpModules >
< httpHandlers >
< add verb ="*" path ="download.aspx" type ="EPWeb.TrafficConfig.DownloadHandler,EPWeb" />
</ httpHandlers >
< httpRuntime maxRequestLength ="40000" useFullyQualifiedRedirectUrl ="true" executionTimeout ="450" />
< httpModules >
< add name ="UploadModule" type ="Bestcomy.Web.Controls.Upload.UploadModule,Bestcomy.Web.Controls.Upload" />
</ httpModules >
< httpHandlers >
< add verb ="*" path ="download.aspx" type ="EPWeb.TrafficConfig.DownloadHandler,EPWeb" />
</ httpHandlers >
< httpRuntime maxRequestLength ="40000" useFullyQualifiedRedirectUrl ="true" executionTimeout ="450" />
调用代码:
using
Bestcomy.Web.Controls.Upload;
private void Page_Load( object sender, System.EventArgs e)
... {
AspnetUpload upldr = new AspnetUpload();
// upldr.RegisterProgressBar("ProgressBar.aspx",btn_upload);
// upldr.RegisterProgressBar(btn_upload);
// upldr.RegisterModelessProgressBar("ProgressBar.aspx",btn_upload);
upldr.RegisterModelessProgressBar(btn_upload);
string fpath = Path.Combine(Server.MapPath("."),"Upload");
if(!Directory.Exists(fpath))
Directory.CreateDirectory(fpath);
upldr.set_UploadFolder(fpath);
}
private void btn_upload_Click( object sender, System.EventArgs e)
... {
AspnetUpload upldr = new AspnetUpload();
StringBuilder sb = new StringBuilder();
foreach(UploadFile file in upldr.GetUploadFiles("file1"))
...{
if(file != null)
...{
string fpath = Path.Combine(Server.MapPath("."),"Upload");
fpath = Path.Combine(fpath,Path.GetFileName(file.get_FileName()));
file.SaveAs(fpath);
sb.Append("<strong>已录入文件:</strong> ");
string url = QueryFilename.EncryptFilename(Path.GetFileName(file.get_FileName()));
sb.Append(""+Path.GetFileName(file.get_FileName())+" ["+file.get_ContentLength().ToString("###,###")+" Bytes]"+"<br>");//<a href="download.aspx?filename="+url+"" target="_blank"></a>
sb.Append("</div>");
Label1.Text=sb.ToString();
} //if
}//foreach
}
private void Page_Load( object sender, System.EventArgs e)
... {
AspnetUpload upldr = new AspnetUpload();
// upldr.RegisterProgressBar("ProgressBar.aspx",btn_upload);
// upldr.RegisterProgressBar(btn_upload);
// upldr.RegisterModelessProgressBar("ProgressBar.aspx",btn_upload);
upldr.RegisterModelessProgressBar(btn_upload);
string fpath = Path.Combine(Server.MapPath("."),"Upload");
if(!Directory.Exists(fpath))
Directory.CreateDirectory(fpath);
upldr.set_UploadFolder(fpath);
}
private void btn_upload_Click( object sender, System.EventArgs e)
... {
AspnetUpload upldr = new AspnetUpload();
StringBuilder sb = new StringBuilder();
foreach(UploadFile file in upldr.GetUploadFiles("file1"))
...{
if(file != null)
...{
string fpath = Path.Combine(Server.MapPath("."),"Upload");
fpath = Path.Combine(fpath,Path.GetFileName(file.get_FileName()));
file.SaveAs(fpath);
sb.Append("<strong>已录入文件:</strong> ");
string url = QueryFilename.EncryptFilename(Path.GetFileName(file.get_FileName()));
sb.Append(""+Path.GetFileName(file.get_FileName())+" ["+file.get_ContentLength().ToString("###,###")+" Bytes]"+"<br>");//<a href="download.aspx?filename="+url+"" target="_blank"></a>
sb.Append("</div>");
Label1.Text=sb.ToString();
} //if
}//foreach
}
下面是一下下载类。
using
System;
using System.Web;
namespace EPWeb.TrafficConfig
... {
/**//// <summary>
/// DownloadHandler class for large file download.
/// </summary>
public class DownloadHandler : IHttpHandler
...{
public DownloadHandler()
...{
}
// Override the ProcessRequest method.
public void ProcessRequest(HttpContext context)
...{
HttpResponse Response = context.Response;
HttpRequest Request = context.Request;
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10240];
// Length of the file:
int length;
// Total bytes to read:
long dataToRead;
try
...{
// Identify the file name.
string filename = QueryFilename.DecryptFilename(Request["filename"]);
// Identify the file to download including its path.
string filepath = System.IO.Path.Combine(HttpContext.Current.Server.MapPath("."),"Upload/"+filename);
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read,System.IO.FileShare.Read);
Response.Clear();
// Total bytes to read:
dataToRead = iStream.Length;
long p = 0;
if(Request.Headers["Range"]!=null)
...{
Response.StatusCode = 206;
p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
}
if(p != 0)
...{
Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
}
Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(filename)));
// Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));
iStream.Position = p;
dataToRead = dataToRead - p;
// Read the bytes.
while (dataToRead > 0)
...{
// Verify that the client is connected.
if (Response.IsClientConnected)
...{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10240);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer= new Byte[10240];
dataToRead = dataToRead - length;
}
else
...{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
...{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
...{
if (iStream != null)
...{
//Close the file.
iStream.Close();
}
Response.End();
}
}
// Override the IsReusable property.
public bool IsReusable
...{
get ...{ return true; }
}
}
}
using System.Web;
namespace EPWeb.TrafficConfig
... {
/**//// <summary>
/// DownloadHandler class for large file download.
/// </summary>
public class DownloadHandler : IHttpHandler
...{
public DownloadHandler()
...{
}
// Override the ProcessRequest method.
public void ProcessRequest(HttpContext context)
...{
HttpResponse Response = context.Response;
HttpRequest Request = context.Request;
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10240];
// Length of the file:
int length;
// Total bytes to read:
long dataToRead;
try
...{
// Identify the file name.
string filename = QueryFilename.DecryptFilename(Request["filename"]);
// Identify the file to download including its path.
string filepath = System.IO.Path.Combine(HttpContext.Current.Server.MapPath("."),"Upload/"+filename);
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read,System.IO.FileShare.Read);
Response.Clear();
// Total bytes to read:
dataToRead = iStream.Length;
long p = 0;
if(Request.Headers["Range"]!=null)
...{
Response.StatusCode = 206;
p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
}
if(p != 0)
...{
Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
}
Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(filename)));
// Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));
iStream.Position = p;
dataToRead = dataToRead - p;
// Read the bytes.
while (dataToRead > 0)
...{
// Verify that the client is connected.
if (Response.IsClientConnected)
...{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10240);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer= new Byte[10240];
dataToRead = dataToRead - length;
}
else
...{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
...{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
...{
if (iStream != null)
...{
//Close the file.
iStream.Close();
}
Response.End();
}
}
// Override the IsReusable property.
public bool IsReusable
...{
get ...{ return true; }
}
}
}
下面是一个加密文件名的类
using
System;
using System.Web;
namespace EPWeb.TrafficConfig
... {
/**//// <summary>
/// QueryFilename class.
/// </summary>
public class QueryFilename
...{
private QueryFilename()
...{
}
public static string EncryptFilename(string filename)
...{
byte[] buffer = HttpContext.Current.Request.ContentEncoding.GetBytes(filename);
return HttpUtility.UrlEncode(Convert.ToBase64String(buffer));
}
public static string DecryptFilename(string encryptfilename)
...{
byte[] buffer = Convert.FromBase64String(encryptfilename);
return HttpContext.Current.Request.ContentEncoding.GetString(buffer);
}
}
}
using System.Web;
namespace EPWeb.TrafficConfig
... {
/**//// <summary>
/// QueryFilename class.
/// </summary>
public class QueryFilename
...{
private QueryFilename()
...{
}
public static string EncryptFilename(string filename)
...{
byte[] buffer = HttpContext.Current.Request.ContentEncoding.GetBytes(filename);
return HttpUtility.UrlEncode(Convert.ToBase64String(buffer));
}
public static string DecryptFilename(string encryptfilename)
...{
byte[] buffer = Convert.FromBase64String(encryptfilename);
return HttpContext.Current.Request.ContentEncoding.GetString(buffer);
}
}
}