谁知道怎么做?我有一个循环,在该循环中建立一个List。我希望每个List都保存为具有不同文件名(duh)的不同文件。我正在使用HttpContext.Current.Response。单个文件工作正常,但是,我无法循环它。我在第二次迭代时收到的错误是“服务器在发送HTTP标头后无法清除标头”。我的代码有点像下面。当然重要的是//响应用户评论的部分。任何评论都非常感谢!
Cheerz, 罗纳德
if ("Philippines".equals(userCountryInput)) {
更新:我现在在内存中创建一个zip存档,创建一个条目并用编写器填充它。但是如何在.zip中创建第二个条目?下面的代码不起作用,错误是“创建模式中的条目只能写入一次,并且一次只能打开一个条目。”
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();
答案 0 :(得分:4)
单个响应只能包含一个&#34;文件&#34;。 (从技术上讲,HTTP没有&#34;文件&#34;的概念,这就是为什么会出现这种情况.HTTP有&#34;标题&#34;和#34;内容&#34;。正如错误告诉的那样您,一旦发送标题,您就无法更改它们。因为它们已经发送给客户。)
您必须从多个请求/回复或compress them into a single file and return that返回文件。
(另外,为什么要将"application/octet-stream"
用于文本文件?也许使用该文件作为压缩文件,但文本文件应该是"text/plain"
或类似的东西。)
答案 1 :(得分:0)
您可以压缩服务器上的所有文件,然后发送一个.zip文件。像谷歌一样:) 它会解决你的问题
答案 2 :(得分:0)
当zip文件打开时,它总是很开放。 但是,如果你试图关闭,只有一种方式处置,但这次它是一个恼人的处置对象。 这是解决方案Dispose并重新打开所有文件 正好在一个开头的例子下面
string MappingpathZip = Path.Combine(HttpRuntime.AppDomainAppPath, @"XmlDocs\Invs\" + firmName + fileName + ".zip");
ZipArchive zip = ZipFile.Open(MappingpathZip, ZipArchiveMode.Create);
ZipArchiveEntry zae = zip.CreateEntryFromFile(MappingpathSignedXML, Path.GetFileName(MappingpathZip), CompressionLevel.Optimal);
var stream = zae.Open();
byte[] bytes;
using (var ms = new MemoryStream())
{
stream.CopyTo(ms);
bytes = ms.ToArray();
}