ASP.net中导出文件时,怎么让它弹出一个保存对话框,可以选择保存的路径、修改保存文件的名称.。然后后台可以获取文件的绝对路径???
浏览器的文件操作都是基于浏览器本身的,浏览器提供什么样的模式你只能用什么样的模式。浏览器弹出的现在对话框可以选择路径和修改文件名,但是拿不到绝对路径,拿到了也没有用。为了保证用户机器的安全,B/s的程序是不允许操作客户端文件的。
那我们平常在网站上下载,比如说下载小说,呢不是会弹出对话框选择保存地址吗?如果没有拿到绝对路径,它有怎么保存呢?
@..00..: 那个下载是后台将数据写入到http响应流中。浏览器判断这个响应是文件下载时,会弹出选择路径的对话框(Chrome不设置的话默认会下载到Download目录),然后浏览器会获取到文件的绝对路径,将文件流写入文件。
@zhangzl: 你说的具体怎么实现啊?
@..00..: 直接把文件流写入请求的相应流里面就行。
1 this.Response.ContentType = "application/octet-stream"; 2 this.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileName)); 3 this.Response.OutputStream.Write(buffer, 0, readLen);
@zhangzl: 你现在忙吗?不忙的话,我把代码给你,你帮我改改。。
@..00..: 我在上班。。。没那么复杂,前台页面没有什么需要处理的,后台就把文件流输出就可以了。
@zhangzl: 可是我不会、不明白、我自己在看看吧。谢谢!!
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; namespace sldemo.Web { public partial class Download : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string fileName = "HtmlPage1.txt"; //First Method //将页面重定向到一个文件,默认就是下载文件,此方法不适用与纯文本的文件,比如.txt文件,浏览器会默认在页面中打开 //this.Response.Redirect(fileName); //Second Method this.Response.ContentType = "application/octet-stream"; this.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileName)); //获取文件信息 fileName = Path.Combine(HttpRuntime.AppDomainAppPath, fileName); FileInfo file = new FileInfo(fileName); FileStream stream = file.OpenRead(); byte[] fileByte = new byte[stream.Length]; stream.Read(fileByte, 0, fileByte.Length); //将文件信息写入相应流。 this.Response.OutputStream.Write(fileByte, 0, fileByte.Length); } protected void btn1_Click(object sender, EventArgs e) { } } }
@..00..:
@zhangzl:
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("NickName", typeof(string));
dt.Columns.Add("QNumber", typeof(string));
DataRow row = dt.NewRow();
row["ID"] = 1;
row["NickName"] = "sanjiawan";
row["QNumber"] = "12345678";
dt.Rows.Add(row);
row = dt.NewRow();
row["ID"] = 2;
row["NickName"] = "人物2";
row["QNumber"] = "9058307";
dt.Rows.Add(row);
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing); //创建工作簿(WorkBook:即Excel文件主体本身)
Worksheet excelWS = (Worksheet)excelWB.Worksheets[1]; //创建工作表(即Excel里的子表sheet) 1表示在子表sheet1里进行数据导出
//excelWS.Cells.NumberFormat = "@"; // 如果数据中存在数字类型 可以让它变文本格式显示
for (int k = 0; k < dt.Columns.Count; k++)
{
excelWS.Cells[1, k + 1] = dt.Columns[k].Caption;
}
//将数据导入到工作表的单元格
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
excelWS.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString(); //Excel单元格第一个从索引1开始
}
}
excelWB.SaveAs("D:\\aaa.xls"); //将其进行保存到指定的路径
excelWB.Close();
excelApp.Quit();
我就是想把“excelWB.SaveAs("D:\\aaa.xls"); //将其进行保存到指定的路径 ”的路径是自己现则的,而不是顶死的
@..00..: excelWB.SaveAs("D:\\aaa.xls");这个方法只是把文件保存到了服务器的某个路径上,你要明白你写的代码最终是运行在服务器上而不是客户端上,所以你操作不了客户端的任何东西,除非你使用ActiveX控件。你可以先把文件保存在服务器的某个临时目录下,然后用Response.Redirect("文件的相对路径");去完成下载。
@zhangzl: 我用了你写的那些代码,可是它下载下来的文件内容不仅是文件本身的内容,还有我当前页面所有的HTML也写进文件里面了。这是为什么呢?
@..00..: 建议你下载单独创建一个页面,里面只处理啊下载操作,不也掺杂别的业务。
@zhangzl: 我单独建了一个页面,可是还是那样啊?
HtmlPage1.txt里面的内容是“fjhgkjnbmmbnv”,下载后的文件内容是:
fjhgkjnbmmbnv
<!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><title>
</title></head>
<body>
<form method="post" action="ziazai.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMjA0OTM4MTAwNGRk6934MHCEUP7s2FFTtN9Q6fqTsRhidnIomTgLvFm470I=" />
</div>
<div class="aspNetHidden">
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgKTmuzqBQKM54rGBr/JkXu5EDSumEf56ZAv9rXInYxW//7H2YeZMaqd7z6z" />
</div>
<div>
</div>
<input type="submit" name="Button1" value="Button" id="Button1" />
</form>
</body>
</html>
@..00..: 没遇到过这种情况,你确定你的文件里面只有那一行数据?你把那个文件换一下,换成你要下载的Excel文件试试。
导出文件,浏览器的处理方式一般是,chrome直接下载到download目录,IE会弹资源管理器窗口让你选择保存文件的位置,其他的有自己的下载弹窗,不太好控制~
另外想获取文件的绝对路径,是文件保存在用户电脑上的绝对路径?这个应该获取不到,因为网站部署在服务器上,最多只能获取图片在服务器硬盘上的绝对路径,想读用户硬盘是做不到的~
就不能有一个类似于WindowsForm里面的saveFileDialog控件用途的?>_<
@..00..: 这个貌似还真没有~
请问你的问题解决了吗