首页 新闻 会员 周边

ASP.NET导出文件??

0
[已解决问题] 解决于 2013-08-17 14:38

ASP.net中导出文件时,怎么让它弹出一个保存对话框,可以选择保存的路径、修改保存文件的名称.。然后后台可以获取文件的绝对路径???

..00..的主页 ..00.. | 初学一级 | 园豆:49
提问于:2013-08-07 16:04
< >
分享
最佳答案
0

浏览器的文件操作都是基于浏览器本身的,浏览器提供什么样的模式你只能用什么样的模式。浏览器弹出的现在对话框可以选择路径和修改文件名,但是拿不到绝对路径,拿到了也没有用。为了保证用户机器的安全,B/s的程序是不允许操作客户端文件的。

奖励园豆:5
zhangzl | 菜鸟二级 |园豆:461 | 2013-08-07 20:44

那我们平常在网站上下载,比如说下载小说,呢不是会弹出对话框选择保存地址吗?如果没有拿到绝对路径,它有怎么保存呢?

..00.. | 园豆:49 (初学一级) | 2013-08-08 08:50

@..00..: 那个下载是后台将数据写入到http响应流中。浏览器判断这个响应是文件下载时,会弹出选择路径的对话框(Chrome不设置的话默认会下载到Download目录),然后浏览器会获取到文件的绝对路径,将文件流写入文件。

zhangzl | 园豆:461 (菜鸟二级) | 2013-08-08 10:40

@zhangzl: 你说的具体怎么实现啊?

..00.. | 园豆:49 (初学一级) | 2013-08-08 10:51

@..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 | 园豆:461 (菜鸟二级) | 2013-08-08 11:06

@zhangzl: 你现在忙吗?不忙的话,我把代码给你,你帮我改改。。

..00.. | 园豆:49 (初学一级) | 2013-08-08 11:22

@..00..: 我在上班。。。没那么复杂,前台页面没有什么需要处理的,后台就把文件流输出就可以了。

zhangzl | 园豆:461 (菜鸟二级) | 2013-08-08 11:28

@zhangzl: 可是我不会、不明白、我自己在看看吧。谢谢!!

..00.. | 园豆:49 (初学一级) | 2013-08-08 11:35
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 | 园豆:461 (菜鸟二级) | 2013-08-08 11:51

@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.. | 园豆:49 (初学一级) | 2013-08-08 12:04

@..00..: excelWB.SaveAs("D:\\aaa.xls");这个方法只是把文件保存到了服务器的某个路径上,你要明白你写的代码最终是运行在服务器上而不是客户端上,所以你操作不了客户端的任何东西,除非你使用ActiveX控件。你可以先把文件保存在服务器的某个临时目录下,然后用Response.Redirect("文件的相对路径");去完成下载。

zhangzl | 园豆:461 (菜鸟二级) | 2013-08-08 12:09

@zhangzl: 我用了你写的那些代码,可是它下载下来的文件内容不仅是文件本身的内容,还有我当前页面所有的HTML也写进文件里面了。这是为什么呢?

..00.. | 园豆:49 (初学一级) | 2013-08-08 16:05

@..00..: 建议你下载单独创建一个页面,里面只处理啊下载操作,不也掺杂别的业务。

zhangzl | 园豆:461 (菜鸟二级) | 2013-08-08 16:49

@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.. | 园豆:49 (初学一级) | 2013-08-08 17:20

@..00..: 没遇到过这种情况,你确定你的文件里面只有那一行数据?你把那个文件换一下,换成你要下载的Excel文件试试。

zhangzl | 园豆:461 (菜鸟二级) | 2013-08-08 19:28
其他回答(3)
0

导出文件,浏览器的处理方式一般是,chrome直接下载到download目录,IE会弹资源管理器窗口让你选择保存文件的位置,其他的有自己的下载弹窗,不太好控制~

另外想获取文件的绝对路径,是文件保存在用户电脑上的绝对路径?这个应该获取不到,因为网站部署在服务器上,最多只能获取图片在服务器硬盘上的绝对路径,想读用户硬盘是做不到的~

libaoheng | 园豆:1433 (小虾三级) | 2013-08-07 16:18

就不能有一个类似于WindowsForm里面的saveFileDialog控件用途的?>_<

支持(0) 反对(0) ..00.. | 园豆:49 (初学一级) | 2013-08-07 16:32

@..00..: 这个貌似还真没有~

支持(0) 反对(0) libaoheng | 园豆:1433 (小虾三级) | 2013-08-07 16:42
0
写代码的小2B | 园豆:4371 (老鸟四级) | 2013-08-07 17:28

啊啊啊,他问的是不显示对话框,保存到固定路径,我要的就是显示对话框,自己选择保存路径、、、

怎么可以这样啊。。。

支持(0) 反对(0) ..00.. | 园豆:49 (初学一级) | 2013-08-07 17:36

如果是定死的路径,我就不用问了

支持(0) 反对(0) ..00.. | 园豆:49 (初学一级) | 2013-08-07 17:37
0

请问你的问题解决了吗

Mr._Kai | 园豆:202 (菜鸟二级) | 2014-01-24 10:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册