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"
/>
调用代码:
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
}
下面是一下下载类。
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;
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);
}
}
}

本文介绍了一个支持多文件上传的组件Bestcomy.Web.Controls.Upload的使用方法,包括配置步骤及调用代码示例,并提供了文件下载类和文件名加密类的实现。

251

被折叠的 条评论
为什么被折叠?



