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

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)

Dav*_*vid 5

单个响应只能包含一个“文件”。(从技术上讲,HTTP 没有“文件”的概念,这就是为什么会这样。HTTP 具有“标题”和“内容”。正如错误告诉您的那样,一旦发送标题,您就无法更改它们。因为它们已经发送给客户了。)

您要么必须从多个请求/响应中返回文件,要么将它们压缩到一个文件中并返回.

(另外,为什么要"application/octet-stream"用于文本文件?也许将它用于压缩文件,但文本文件可能应该是"text/plain"或类似的。)