Ron*_*ald 0 c# asp.net asp.net-mvc-4
谁知道怎么做?我有一个循环,并在该循环中建立了一个列表。我希望每个列表都保存为具有不同文件名(废话)的不同文件。我为此使用 HttpContext.Current.Response。单个文件工作正常,但是,我无法循环它。我在第二次迭代时收到的错误是“发送 HTTP 标头后服务器无法清除标头”。我的代码有点像下面。当然重要的是 // response to user 所评论的部分。任何评论高度赞赏!
干杯,罗纳德
foreach (GridViewRow dr in GridView1.Rows)
{
// find the check box in the row
System.Web.UI.WebControls.CheckBox cb = (System.Web.UI.WebControls.CheckBox)dr.FindControl("chkbx_selected");
// see if it's checked
if (cb != null && cb.Checked)
{
// get the cell
DataControlFieldCell Cell = GetCellByName(dr, "GUID");
string guid = new Guid(Cell.Text);
// get the record filtered on the GUID
var result_json = call_WEBAPI(guid);
// result_json contains serialized List<string>
List<string> result = JsonConvert.DeserializeObject<List<string>>(result_json);
// response to user
string filename = result[0] + ".txt";
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.AppendHeader("content-disposition", string.Format("attachment; filename={0}", filename));
HttpContext.Current.Response.ContentType = "application/octet-stream";
foreach (string line in result)
{
HttpContext.Current.Response.Write(line + Environment.NewLine);
}
HttpContext.Current.Response.Flush();
}
}
HttpContext.Current.Response.End();
Run Code Online (Sandbox Code Playgroud)
更新:我现在在内存中创建一个 zip 存档,创建一个条目并用作家填充它。但是如何在 .zip 中创建第二个条目?下面的代码不起作用,错误是“创建模式下的条目只能写入一次,并且一次只能打开一个条目。”
using (MemoryStream zipToOpen = new MemoryStream())
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create, true))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
List<string> result = new List<string>();
result.Add("line1");
result.Add("line2");
ZipArchiveEntry readmeEntry2 = archive.CreateEntry("Readme2.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.Write(result);
}
}
using (var fileStream = new FileStream(@"C:\test.zip", FileMode.Create))
{
zipToOpen.Seek(0, SeekOrigin.Begin);
zipToOpen.CopyTo(fileStream);
}
}
Run Code Online (Sandbox Code Playgroud)
单个响应只能包含一个“文件”。(从技术上讲,HTTP 没有“文件”的概念,这就是为什么会这样。HTTP 具有“标题”和“内容”。正如错误告诉您的那样,一旦发送标题,您就无法更改它们。因为它们已经发送给客户了。)
您要么必须从多个请求/响应中返回文件,要么将它们压缩到一个文件中并返回.
(另外,为什么要"application/octet-stream"用于文本文件?也许将它用于压缩文件,但文本文件可能应该是"text/plain"或类似的。)