我正在开发一个ASP.NET Web应用程序,其中表被转换为excel电子表格。我想让用户选择保存除下载部分之外的其他地方。我意识到这很可能是禁止的,但也许ASP.net框架可以促进某种类/机制。
这是我目前的代码:
protected void saveDataButton_Click(Object sender, EventArgs e)
{
SaveFileDialog browser = new SaveFileDialog();
string fileName;
if (browser.ShowDialog() == DialogResult.OK)
{
fileName = browser.FileName;
}
else
return;
DataTable table = (DataTable)Session["tableData"];
HttpContext context = HttpContext.Current;
context.Response.Clear();
context.Response.ContentType = "text/csv";
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName + ".csv");
foreach (DataColumn column in table.Columns)
{
context.Response.Write(column.ColumnName + ";");
}
context.Response.Write(Environment.NewLine);
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < row.ItemArray.Length; i++)
{
context.Response.Write(row[i].ToString().Replace(";", string.Empty) + ";");
}
context.Response.Write(Environment.NewLine);
}
context.Response.End();
}
我知道我在这个上下文中使用fileName的方式是错误的,因为fileName实际上是在我的代码中存储文件路径+文件名。有什么方法可以指定文件路径吗?
我能想到的唯一其他解决方案是,如果我在页面上创建某种文件并右键单击+另存为。这是一个不好的选择吗?还有其他人吗?
答案 0 :(得分:3)
没有。 Web应用程序对本地文件系统一无所知。 (实际上,除了content-disposition
标头之外,HTTP协议甚至不知道“文件”是什么。)
您正在做的事情(除了content-disposition
标题中的完整路径)是正确的。将文件发送到Web客户端的标准方法是设置该标头并将文件内容写入输出。客户端发生的事情完全取决于Web浏览器。如果用户的Web浏览器设置为在没有提示的情况下自动将下载保存到特定文件夹,则无法从服务器更改该文件夹。
答案 1 :(得分:1)
不,文件保存在用户计算机上的位置由网络浏览器决定,它与网络服务器无关。想一想,你不知道网站访问者正在运行什么操作系统,更不用说你在服务器上指定的任意路径了。