各位做网站的大侠们,来看一下吧!!急 asp.net 中 怎么样做一个下载的功能呢??就是把上传的文件放到数据库了面, 等客户端要下载的时候从数据库里面提取出来供给下载。有没有没实际的例子呢?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //提供下载的文件,不编码的话文件名会乱码 private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar"); private string filePath = HttpContext.Current.Server.MapPath("规范.rar"); //使用TransmifFile下载文件 protected void btnDL1_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; Response.Clear(); Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName); //不指明Content-Length用Flush的话不会显示下载进度 Response.AddHeader("Content-Length", fileSize.ToString()); Response.TransmitFile(filePath, 0, fileSize); Response.Flush(); Response.Close(); } //使用WriteFile下载文件 protected void btnDL2_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; Response.Clear(); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); //指定文件大小 Response.AddHeader("Content-Length", fileSize.ToString()); Response.WriteFile(filePath, 0, fileSize); Response.Flush(); Response.Close(); } //使用OutputStream.Write分块下载文件 protected void btnDL3_Click(object sender, EventArgs e) { //指定块大小 long chunkSize = 102400; //建立一个100K的缓冲区 byte[] buffer = new byte[chunkSize]; //已读的字节数 long dataToRead = 0; FileStream stream = null; try { //打开文件 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead = stream.Length; //添加Http头 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", dataToRead.ToString()); while (dataToRead > 0) { if (Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); Response.OutputStream.Write(buffer, 0, length); Response.Flush(); Response.Clear(); dataToRead -= length; } else { //防止client失去连接 dataToRead = -1; } } } catch (Exception ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close(); } Response.Close(); } } //使用BinaryWrite下载文件,大文件效率不行 protected void btnDL4_Click(object sender, EventArgs e) { FileStream stream = null; try { //读文件,大文件一次读入会占用大量内存 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); stream.Close(); //添加Http头 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", bytes.Length.ToString()); Response.BinaryWrite(bytes); Response.Flush(); } catch (Exception ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close(); } Response.Close(); } } //使用BinaryWrite分块下载文件 protected void btnDL5_Click(object sender, EventArgs e) { //指定区块和缓冲区 long chunkSize = 102400; byte[] buffer = new byte[chunkSize]; FileStream stream = null; long dataToRead = 0; try { stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead = stream.Length; //添加Http头 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", dataToRead.ToString()); while (dataToRead > 0) { if (Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); Response.BinaryWrite(buffer); Response.Flush(); Response.Clear(); dataToRead -= length; } else { dataToRead = -1; } } } catch (Exception ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close(); } Response.Close(); } } 修改下~~ private void DownLoadFile() { try { WebClient client = new WebClient(); if (!Directory.Exists(Application.StartupPath + @"\update")) { Directory.CreateDirectory(Application.StartupPath + @"\update"); } for (int i = 0; i <= this.listView1.Items.Count - 1; i++) { string fileName = this.listView1.Items[i].SubItems[0].Text; string url = @"http://172.16.120.155/update/UpdateFile/" + fileName; string file = Application.StartupPath + "\\update\\" + fileName; this.label2.Text = "正在下载:" + fileName; Stream myStream = client.OpenRead(url); byte[] bBuffer = new byte[10240]; int nRealCount = 0; DateTime dtStart=DateTime.Now ; TimeSpan ts; int lenth = Convert.ToInt32(this.listView1.Items[i].SubItems[1].Text.ToString()); int cur = 0; progressBar1.Value = 0; FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write); //do //{ // dtStart = DateTime.Now; // nRealCount = myStream.Read(bBuffer, 0, bBuffer.Length); // if (nRealCount > 0) // { // fs.Write(bBuffer, 0, nRealCount); // } // ts = DateTime.Now - dtStart; // cur = cur + nRealCount; // double pe = cur; // pe = pe * 100 / lenth; // int va = Convert.ToInt32(pe); // progressBar1.Value = va; // this.label2.Text = "正在下载:" + fileName + " " + cur / 1024 + " KB/" + lenth / 1024 + " KB"; // MessageBox.Show("" + ts.Milliseconds + " " + ts.TotalMilliseconds); // // this.label2.Text = "正在下载:" + fileName + " " + cur / 1024 + " KB/" + lenth / 1024 + " KB"+" 下载速度:"+((double )nRealCount /(int)(ts.TotalMilliseconds/1000)) +" kb/s"; // // 计算流量可以用 nRealCount / ts.Seconds来进行估算 //} int value=0; int counter = 1; do { if (counter % 10 == 0) { ts = DateTime.Now - dtStart; int perSecondsValue = (int)((double)value / (ts.TotalMilliseconds / 1000)) / 1024; this.label3.Text = "速度:" +perSecondsValue +" k/s"; dtStart = DateTime.Now; value = 0; } nRealCount = myStream.Read(bBuffer, 0, bBuffer.Length); if (nRealCount > 0) { fs.Write(bBuffer, 0, nRealCount); } cur = cur + nRealCount; double pe = cur; pe = pe * 100 / lenth; int va = Convert.ToInt32(pe); progressBar1.Value = va; this.label2.Text = "正在下载:" + fileName + " " + cur / 1024 + " KB/" + lenth / 1024 + " KB"; value += nRealCount; counter++; } while (nRealCount > 0); fs.Close(); // client.DownloadFile(url, file); this.listView1.Items[i].SubItems.Add("已下载"); } this.progressBar1.Visible = false; this.label3.Visible = false; this.label2.Text = "正在更新文件,请稍后..."; string[] fileDir = Directory.GetFileSystemEntries(Application.StartupPath + @"\update"); foreach (string str in fileDir) { int pos = str.LastIndexOf(@"\"); string FileName = str.Substring(pos); string FilePath = Application.StartupPath + FileName; File.Copy(str, FilePath, true); } this.label2.Text = "程序更新已完成!"; this.label1.Text = this.finish; this.btnNext.Enabled = false; this.listView1.Visible = false; this.btnExit.Text = "完成(&F)"; step++; } catch (Exception errMsg) { MessageBox.Show(errMsg.Message); } } 不用放入数据库里面 放在数据库里面只是相对的路径而已 建立一个文件夹 讲上传的东西 等于move 进文件夹 然后再上传下载的时候将路径放在数据库 就Ok了 还有为了 避免 网站上传下载的 流量大 和 文件名称相同的问题可以在上传的路径的代码后面加上当前的时间,截取到毫秒。不可能会有人在一毫秒上传同样名称的文件吧 这样问题就Ok了 很多方法,但是把文件存到数据库里貌似非常的慢,如果是从文件夹里下载方法如下:public static void FileDownload(string FileName) //fileName为虚拟路径{ String FullFileName = System.Web.HttpContext.Current.Server.MapPath(FileName); FileInfo DownloadFile = new FileInfo(FullFileName); System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.ClearHeaders(); System.Web.HttpContext.Current.Response.Buffer = false; System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8)); System.Web.HttpContext.Current.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString()); System.Web.HttpContext.Current.Response.WriteFile(DownloadFile.FullName); System.Web.HttpContext.Current.Response.Flush(); System.Web.HttpContext.Current.Response.End(); } 下载,直接调用方法/////////////////////////////////////////////////大文件下载public bool Down(string filepath, string code) { bool succ = false; System.IO.Stream iStream = null; // Buffer to read 10K bytes in chunk: byte[] buffer = new Byte[10000]; // Length of the file: int length; // Total bytes to read: long dataToRead; // Identify the file to download including its path. // string filepath = "DownloadFileName"; // Identify the file name. string filename = System.IO.Path.GetFileName(filepath); try { // Open the file. iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); // Total bytes to read: dataToRead = iStream.Length; Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); // 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, 10000); // 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[10000]; 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(); } } return succ; }从数据库下载数据: string ConnStr = "server=(local);user id=sa;pwd=sa;database=test"; string strSql = "select * from piclist"; SqlConnection conn = new SqlConnection(ConnStr); conn.Open(); SqlCommand cmd=new SqlCommand(strSql,conn); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Response.ContentType = "application/octet-stream"; Response.BinaryWrite((Byte[])reader["pic"]); Response.Write("successful"); } reader.Close(); conn.Close(); Response.End();注意把,下边的改一改,然后建一个下载用的数据流,把字节数组放到流中,就可以了 熟悉iis7的进来帮忙下 为神马我的脚本放在aspx里面运行后联动消失了 关于GridView中子控件获取值的问题 求各位谈谈关于在vs调试过程中的那些信息作何解读。 JS调用IE打印设置横纵向问题 Server.Transfer传递页面后,能获得上一页面的DataList数据源吗? 毕设老师BT,学生无奈。在此向各位高人请教!~ 怎样避免DropDownList增加值? 最后10分,关于2005中发邮件,给我改改 请教关于页面的问题 怎样屏蔽get提交,只允许post提交 问两表多次级联查询的SQL语句
private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar");
private string filePath = HttpContext.Current.Server.MapPath("规范.rar");
//使用TransmifFile下载文件
protected void btnDL1_Click(object sender, EventArgs e)
{
FileInfo info = new FileInfo(filePath);
long fileSize = info.Length;
Response.Clear();
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName);
//不指明Content-Length用Flush的话不会显示下载进度
Response.AddHeader("Content-Length", fileSize.ToString());
Response.TransmitFile(filePath, 0, fileSize);
Response.Flush();
Response.Close();
}
//使用WriteFile下载文件
protected void btnDL2_Click(object sender, EventArgs e)
{
FileInfo info = new FileInfo(filePath);
long fileSize = info.Length;
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
//指定文件大小
Response.AddHeader("Content-Length", fileSize.ToString());
Response.WriteFile(filePath, 0, fileSize);
Response.Flush();
Response.Close();
}
//使用OutputStream.Write分块下载文件
protected void btnDL3_Click(object sender, EventArgs e)
{
//指定块大小
long chunkSize = 102400;
//建立一个100K的缓冲区
byte[] buffer = new byte[chunkSize];
//已读的字节数
long dataToRead = 0;
FileStream stream = null;
try
{
//打开文件
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
dataToRead = stream.Length;
//添加Http头
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
Response.AddHeader("Content-Length", dataToRead.ToString());
while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
Response.Clear();
dataToRead -= length;
}
else
{
//防止client失去连接
dataToRead = -1;
}
}
}
catch (Exception ex)
{
Response.Write("Error:" + ex.Message);
}
finally
{
if (stream != null)
{
stream.Close();
}
Response.Close();
}
}
//使用BinaryWrite下载文件,大文件效率不行
protected void btnDL4_Click(object sender, EventArgs e)
{
FileStream stream = null;
try
{
//读文件,大文件一次读入会占用大量内存
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
//添加Http头
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
Response.AddHeader("Content-Length", bytes.Length.ToString());
Response.BinaryWrite(bytes);
Response.Flush();
}
catch (Exception ex)
{
Response.Write("Error:" + ex.Message);
}
finally
{
if (stream != null)
{
stream.Close();
}
Response.Close();
}
}
//使用BinaryWrite分块下载文件
protected void btnDL5_Click(object sender, EventArgs e)
{
//指定区块和缓冲区
long chunkSize = 102400;
byte[] buffer = new byte[chunkSize];
FileStream stream = null;
long dataToRead = 0;
try
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
dataToRead = stream.Length;
//添加Http头
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);
Response.AddHeader("Content-Length", dataToRead.ToString()); while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
Response.BinaryWrite(buffer);
Response.Flush();
Response.Clear(); dataToRead -= length;
}
else
{
dataToRead = -1;
}
} }
catch (Exception ex)
{
Response.Write("Error:" + ex.Message);
}
finally
{
if (stream != null)
{
stream.Close();
}
Response.Close();
}
}
{
try
{
WebClient client = new WebClient();
if (!Directory.Exists(Application.StartupPath + @"\update"))
{
Directory.CreateDirectory(Application.StartupPath + @"\update");
}
for (int i = 0; i <= this.listView1.Items.Count - 1; i++)
{
string fileName = this.listView1.Items[i].SubItems[0].Text;
string url = @"http://172.16.120.155/update/UpdateFile/" + fileName;
string file = Application.StartupPath + "\\update\\" + fileName;
this.label2.Text = "正在下载:" + fileName;
Stream myStream = client.OpenRead(url);
byte[] bBuffer = new byte[10240];
int nRealCount = 0;
DateTime dtStart=DateTime.Now ;
TimeSpan ts;
int lenth = Convert.ToInt32(this.listView1.Items[i].SubItems[1].Text.ToString());
int cur = 0;
progressBar1.Value = 0;
FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write);
//do
//{
// dtStart = DateTime.Now;
// nRealCount = myStream.Read(bBuffer, 0, bBuffer.Length);
// if (nRealCount > 0)
// {
// fs.Write(bBuffer, 0, nRealCount);
// }
// ts = DateTime.Now - dtStart;
// cur = cur + nRealCount;
// double pe = cur;
// pe = pe * 100 / lenth;
// int va = Convert.ToInt32(pe);
// progressBar1.Value = va;
// this.label2.Text = "正在下载:" + fileName + " " + cur / 1024 + " KB/" + lenth / 1024 + " KB";
// MessageBox.Show("" + ts.Milliseconds + " " + ts.TotalMilliseconds);
// // this.label2.Text = "正在下载:" + fileName + " " + cur / 1024 + " KB/" + lenth / 1024 + " KB"+" 下载速度:"+((double )nRealCount /(int)(ts.TotalMilliseconds/1000)) +" kb/s";
// // 计算流量可以用 nRealCount / ts.Seconds来进行估算
//}
int value=0;
int counter = 1;
do
{
if (counter % 10 == 0)
{
ts = DateTime.Now - dtStart;
int perSecondsValue = (int)((double)value / (ts.TotalMilliseconds / 1000)) / 1024;
this.label3.Text = "速度:" +perSecondsValue +" k/s";
dtStart = DateTime.Now;
value = 0;
}
nRealCount = myStream.Read(bBuffer, 0, bBuffer.Length);
if (nRealCount > 0)
{
fs.Write(bBuffer, 0, nRealCount);
}
cur = cur + nRealCount;
double pe = cur;
pe = pe * 100 / lenth;
int va = Convert.ToInt32(pe);
progressBar1.Value = va;
this.label2.Text = "正在下载:" + fileName + " " + cur / 1024 + " KB/" + lenth / 1024 + " KB";
value += nRealCount;
counter++;
}
while (nRealCount > 0);
fs.Close();
// client.DownloadFile(url, file);
this.listView1.Items[i].SubItems.Add("已下载");
}
this.progressBar1.Visible = false;
this.label3.Visible = false;
this.label2.Text = "正在更新文件,请稍后...";
string[] fileDir = Directory.GetFileSystemEntries(Application.StartupPath + @"\update");
foreach (string str in fileDir)
{
int pos = str.LastIndexOf(@"\");
string FileName = str.Substring(pos);
string FilePath = Application.StartupPath + FileName;
File.Copy(str, FilePath, true);
}
this.label2.Text = "程序更新已完成!";
this.label1.Text = this.finish;
this.btnNext.Enabled = false;
this.listView1.Visible = false;
this.btnExit.Text = "完成(&F)";
step++;
}
catch (Exception errMsg)
{
MessageBox.Show(errMsg.Message);
}
}
放在数据库里面只是相对的路径而已
建立一个文件夹
讲上传的东西 等于move 进文件夹
然后再上传下载的时候将路径放在数据库 就Ok了
还有为了 避免 网站上传下载的 流量大 和 文件名称相同的问题
可以在上传的路径的代码后面加上当前的时间,截取到毫秒。
不可能会有人在一毫秒上传同样名称的文件吧
这样问题就Ok了
public static void FileDownload(string FileName) //fileName为虚拟路径
{
String FullFileName = System.Web.HttpContext.Current.Server.MapPath(FileName);
FileInfo DownloadFile = new FileInfo(FullFileName);
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ClearHeaders();
System.Web.HttpContext.Current.Response.Buffer = false;
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
System.Web.HttpContext.Current.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
System.Web.HttpContext.Current.Response.WriteFile(DownloadFile.FullName);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.End();
}
下载,直接调用方法
/////////////////////////////////////////////////
大文件下载
public bool Down(string filepath, string code)
{
bool succ = false; System.IO.Stream iStream = null; // Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000]; // Length of the file:
int length; // Total bytes to read:
long dataToRead; // Identify the file to download including its path.
// string filepath = "DownloadFileName"; // Identify the file name.
string filename = System.IO.Path.GetFileName(filepath); try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// Total bytes to read:
dataToRead = iStream.Length; Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); // 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, 10000); // 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[10000];
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();
}
}
return succ;
}从数据库下载数据:
string ConnStr = "server=(local);user id=sa;pwd=sa;database=test";
string strSql = "select * from piclist";
SqlConnection conn = new SqlConnection(ConnStr);
conn.Open(); SqlCommand cmd=new SqlCommand(strSql,conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Response.ContentType = "application/octet-stream";
Response.BinaryWrite((Byte[])reader["pic"]);
Response.Write("successful");
}
reader.Close();
conn.Close();
Response.End();
注意把,下边的改一改,然后建一个下载用的数据流,把字节数组放到流中,就可以了