Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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# 从单个表中下载多个.csv。ASP.NETMVC_C#_Asp.net Mvc_Csv - Fatal编程技术网

C# 从单个表中下载多个.csv。ASP.NETMVC

C# 从单个表中下载多个.csv。ASP.NETMVC,c#,asp.net-mvc,csv,C#,Asp.net Mvc,Csv,下面的代码片段可以很好地将sql表下载到.csv,但是不起作用的是,当我尝试像这样动态地指定文件名时 而不是: response.AddHeader("content-disposition", "attachment;filename=Logs.csv"); 我使用: response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv"); 它将文件保存为.txt而不是.csv为什么会这

下面的代码片段可以很好地将sql表下载到
.csv
,但是不起作用的是,当我尝试像这样动态地指定文件名时

而不是:

response.AddHeader("content-disposition", "attachment;filename=Logs.csv");
我使用:

response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv");
它将文件保存为
.txt
而不是
.csv
为什么会这样

此外,作为crystal,我有一个表,它根据列
MacNum
将记录彼此分开。我试图从同一个表中生成两个不同的
.csv
文件,但文件名不同,如果我取消注释下面的部分(注释了一个),它会引发
“无法发送头”
异常

 public void ExportCSV_CloudLogs()
        {
            School sch = (from sc in db.Schools
                          where sc.MacNum == 1.ToString()
                          select sc).FirstOrDefault();
            var sb = new StringBuilder();
            var list  = (from o in db.Logs where o.MacNum == 1
                         select o).ToList();
            sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", "No", "Name", "Time", "Mode", "Ex", "Type", "SId", "Work", "sDate", "MachineNum", Environment.NewLine);
            foreach (var item in list)
            {
                sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", item.No, item.Name, item.Time, item.Mode, item.Ex, item.Type, item.SId, item.Work, item.Date, item.MacNum, Environment.NewLine);
            }
            //Get Current Response  
            var response = System.Web.HttpContext.Current.Response;
            response.BufferOutput = true;
            response.Clear();
            response.ClearHeaders();
            response.ContentEncoding = Encoding.Unicode;
            response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv");
            response.ContentType = "text/plain";
            response.Write(sb.ToString());
            response.End();

            //School sch2 = (from sc in db.Schools
            //               where sc.MacNum == 2.ToString()
            //               select sc).FirstOrDefault();
            //var sb2 = new StringBuilder();
            //var list2 = (from o in db.Logs
            //            where o.MacNum == 2
            //            select o).ToList();
            //sb2.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", "No", "Name", "Time", "Mode", "Ex", "Type", "SId", "Work", "sDate", "MacNum", Environment.NewLine);
            //foreach (var item in list2)
            //{
            //    sb2.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", item.No, item.Name, item.Time, item.Mode, item.Exception, item.Type, item.SId, item.Work, item.Date, item.MacNum, Environment.NewLine);
            //}
            ////Get Current Response  
            //var response2 = System.Web.HttpContext.Current.Response;
            //response2.BufferOutput = true;
            //response2.Clear();
            //response2.ClearHeaders();
            //response2.ContentEncoding = Encoding.Unicode;
            //response2.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".CSV ");
            //response2.ContentType = "text/plain";
            //response2.Write(sb2.ToString());
            //response2.End();
        }
更新: 下面是它正在拍摄的
文件名
的图片,但它仅使用
whs
保存它

此外,如何为同一表中的另一所学校再次运行相同的代码?(上面代码片段中的注释代码)

尝试这样使用

response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", sch.SchoolName));
或者试试下面的方法

var attachmentValue = string.Format("attachment; filename={0}.csv", sch.SchoolName);
response.AddHeader("content-disposition", attachmentValue);
response.ContentType = "text/csv";
试着这样使用

response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", sch.SchoolName));
或者试试下面的方法

var attachmentValue = string.Format("attachment; filename={0}.csv", sch.SchoolName);
response.AddHeader("content-disposition", attachmentValue);
response.ContentType = "text/csv";

下面是此错误的解决方案

var fileDetail=“附件;文件名=“+sch.SchoolName+”.csv”


AddHeader(“内容处置”,fileDetail)

下面是此错误的解决方案

var fileDetail=“附件;文件名=“+sch.SchoolName+”.csv”


AddHeader(“内容处置”,fileDetail)

回答第一个问题:为什么文件名不起作用

阅读后,您似乎必须将文件名设置为双引号:

内容处置:附件;filename=“filename.jpg”

文件名

后跟一个字符串,该字符串包含传输文件的原始名称。文件名始终是可选的,应用程序不能盲目使用:应该删除路径信息,并转换为服务器文件系统规则。此参数主要提供指示性信息。当与Content Disposition:attachment结合使用时,它将用作最终显示给用户的“另存为”对话框的默认文件名

因此,您应该在字符串中添加双引号:

response.AddHeader("content-disposition", "attachment;filename=\"" + sch.SchoolName + ".csv\"");

回答第二个问题为什么无法发送第二个文件

如果取消对第二个代码块的注释,它将失败,因为对于一个请求,您只能返回一个响应(也称为一个文件)。当您在活动代码中调用
response.End()
,然后在同一响应上调用其他方法时(即使您通过另一个变量名请求它)由于流已关闭,因此出现错误

如果您认为您现在可以很聪明,只需不调用
response.End()
,它也不会起作用,因为在这种情况下,您只会收到一个文件,其中包含您想要获取的两个文件的数据

所以有一个简单的规则:一个请求导致一个响应,其中包含一个文件。为了实现您的目标,现在有两种可能的解决方案:

  • 您仍然返回一个文件,但这是一种包含多个文件的容器文件
  • 您采用客户端和服务器。服务器不发送文件内容,而是返回可用文件名的列表。然后客户端为列表中的每个条目打开一个请求,其中包含所需的文件名,您可以分别发回每个文件

  • 回答第一个问题,为什么文件名不起作用

    阅读后,您似乎必须将文件名设置为双引号:

    内容处置:附件;filename=“filename.jpg”

    文件名

    后跟一个字符串,其中包含传输的文件的原始名称。文件名始终是可选的,应用程序不得盲目使用:应去除路径信息,并应完成到服务器文件系统规则的转换。此参数主要提供指示性信息。与Co结合使用时ntent Disposition:附件,它用作最终呈现给用户的“另存为”对话框的默认文件名

    因此,您应该在字符串中添加双引号:

    response.AddHeader("content-disposition", "attachment;filename=\"" + sch.SchoolName + ".csv\"");
    

    回答第二个问题为什么无法发送第二个文件

    如果取消注释第二个代码块,它将失败,因为对于一个请求,您只能返回一个响应(也称为一个文件)。当您在活动代码中调用
    response.End()
    ,然后在同一响应上调用其他方法(即使您通过另一个变量名请求响应)时,由于流已经关闭,因此会出现错误

    如果您认为您现在可以很聪明,只需不调用
    response.End()
    ,它也不会起作用,因为在这种情况下,您只会收到一个文件,其中包含您想要获取的两个文件的数据

    所以有一个简单的规则:一个请求导致一个响应,其中包含一个文件。为了实现您的目标,现在有两种可能的解决方案:

  • 您仍然返回一个文件,但这是一种包含多个文件的容器文件。你肯定知道的一个突出的例子是.zip文件
  • 您采用客户端和服务器。服务器不发送文件的内容。相反,它返回可用文件名的列表。然后,客户端为列表中的每个条目打开一个带有所需文件名的请求,您可以分别发回每个文件

  • 在字符串“attachment;filename=“+sch.SchoolName+”.csv”中,不要连接文件名,而是将完整的字符串放入变量并传递到此处;AddHeader(“内容处置”、“附件;文件名=“+filename+”.csv”)但这会再次将其保存为
    .txt
    。另外,它不使用db>
    ABC-O Levels中存储的全名,而只使用