Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回要从asp.net下载的多个文件_C#_Asp.net_Asp.net Mvc 4 - Fatal编程技术网

C# 返回要从asp.net下载的多个文件

C# 返回要从asp.net下载的多个文件,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,谁知道怎么做?我有一个循环,在这个循环中建立了一个列表。我希望每个列表都保存为具有不同文件名(duh)的不同文件。我正在为此使用HttpContext.Current.Response。单个文件可以正常工作,但是,我不能循环它。我在第二次迭代中收到的错误是“发送HTTP头之后,服务器无法清除头。”我的代码有点像下面。当然,重要的是//对用户的响应所评论的部分。任何意见高度赞赏 干杯, 罗纳德 foreach(GridView1.Rows中的GridViewRow dr) { //在行中找到该复选

谁知道怎么做?我有一个循环,在这个循环中建立了一个列表。我希望每个列表都保存为具有不同文件名(duh)的不同文件。我正在为此使用HttpContext.Current.Response。单个文件可以正常工作,但是,我不能循环它。我在第二次迭代中收到的错误是“发送HTTP头之后,服务器无法清除头。”我的代码有点像下面。当然,重要的是//对用户的响应所评论的部分。任何意见高度赞赏

干杯, 罗纳德

foreach(GridView1.Rows中的GridViewRow dr)
{
//在行中找到该复选框
System.Web.UI.WebControls.CheckBox cb=(System.Web.UI.WebControls.CheckBox)dr.FindControl(“chkbx_选中”);
//看看有没有检查过
如果(cb!=null&&cb.Checked)
{
//去拿手机
DataControlFieldCell Cell=GetCellByName(dr,“GUID”);
字符串guid=新guid(Cell.Text);
//在GUID上筛选记录
var result_json=call_WEBAPI(guid);
//结果\u json包含序列化列表
List result=JsonConvert.DeserializeObject(result\u json);
//对用户的响应
字符串文件名=结果[0]+“.txt”;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.AppendHeader(“内容处置”,string.Format(“附件;文件名={0}”,文件名));
HttpContext.Current.Response.ContentType=“应用程序/八位字节流”;
foreach(结果中的字符串行)
{
HttpContext.Current.Response.Write(line+Environment.NewLine);
}
HttpContext.Current.Response.Flush();
}
}
HttpContext.Current.Response.End();
更新:我现在在内存中创建一个zip存档,创建一个条目,并用一个writer填充它。但是如何在.zip中创建第二个条目??下面的代码不起作用,错误是“创建模式下的条目只能写入一次,一次只能打开一个条目。”

使用(MemoryStream zipToOpen=new MemoryStream())
{
使用(ZipArchive archive=new ZipArchive(zipToOpen,ZipArchiveMode.Create,true))
{
ZipArchiveEntry readmeEntry=archive.CreateEntry(“Readme.txt”);
使用(StreamWriter=newstreamwriter(readmeEntry.Open()))
{
WriteLine(“有关此包的信息”);
writer.WriteLine(“==============================================”);
}
列表结果=新列表();
结果。添加(“第1行”);
结果。添加(“第2行”);
ZipArchiveEntry readmeEntry2=archive.CreateEntry(“Readme2.txt”);
使用(StreamWriter=newstreamwriter(readmeEntry.Open()))
{
写(结果);
}
}
使用(var fileStream=newfilestream(@“C:\test.zip”,FileMode.Create))
{
ziptopen.Seek(0,SeekOrigin.Begin);
CopyTo(文件流);
}
}

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

您必须返回来自多个请求/响应的文件,或者


(还有,为什么要对文本文件使用
“应用程序/八位字节流”
?也许可以对压缩文件使用它,但文本文件可能应该是
“文本/普通”
或类似文件。)

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

您必须返回来自多个请求/响应的文件,或者


(还有,为什么要对文本文件使用
“应用程序/八位字节流”
?也许可以对压缩文件使用它,但文本文件可能应该是
“文本/普通”
或类似文件。)

您可以压缩服务器上的所有文件,然后发送一个.zip文件。正如谷歌所做的:)
它将解决您的问题

您可以压缩服务器上的所有文件,然后发送一个.zip文件。正如谷歌所做的:)
它将解决您的问题

当zip文件打开时,它始终处于打开状态。! 但是,如果您试图关闭,只有一种方式处置,但这次是另一种处置对象。 这就是处置并重新打开所有文件的解决方案 下面是一个开场白

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

当zip文件打开时,它总是打开的。! 但是,如果您试图关闭,只有一种方式处置,但这次是另一种处置对象。 这就是处置并重新打开所有文件的解决方案 下面是一个开场白

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

如果您愿意,您可以使用jquery进行演练。我对jquery一无所知。通常我只处理API后端,但我需要一个简单的GUI。但是我可以试着使用这篇文章,谢谢。如果你愿意,你可以使用jquery,我对jquery一无所知。通常我只处理API后端,但我需要一个简单的GUI。但是我可以试着用这篇文章,谢谢。是的,我想这应该是根本原因。但是,如何通过单击asp页面上的一个按钮生成多个请求/响应?我可以在这里使用任务或任务(每个文件=一个线程)?和“应用程序/八位字节”
       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();
        }