返回多个文件从asp.net下载

时间:2015-07-08 11:48:34

标签: c# asp.net asp.net-mvc-4

谁知道怎么做?我有一个循环,在该循环中建立一个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();

3 个答案:

答案 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();
        }