Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 从包含base64编码内容的XML创建ZipArchive_C#_Asp.net_Zip_Linq To Xml - Fatal编程技术网

C# 从包含base64编码内容的XML创建ZipArchive

C# 从包含base64编码内容的XML创建ZipArchive,c#,asp.net,zip,linq-to-xml,C#,Asp.net,Zip,Linq To Xml,我正在动态创建一个XML文件。 它的一个节点包含一个编码为BASE64字符串的ZIP文件 然后我创建另一个ZIP文件。 我添加了这个XML文件和一些其他JPEG文件。 我将文件输出到浏览器 我无法打开最终的ZIP文件。 我得到:“Windows无法打开该文件夹。压缩(压缩)文件夹'c:\path\file.zip'无效。” 我能够将原始XML文件保存到文件系统中。 我可以打开XML文件,解码ZIP节点并保存到文件系统。 然后我就可以毫无问题地打开这个Zip文件了 我可以创建最终的ZIP文件,省略

我正在动态创建一个XML文件。 它的一个节点包含一个编码为BASE64字符串的ZIP文件

然后我创建另一个ZIP文件。 我添加了这个XML文件和一些其他JPEG文件。 我将文件输出到浏览器

我无法打开最终的ZIP文件。 我得到:“Windows无法打开该文件夹。压缩(压缩)文件夹'c:\path\file.zip'无效。”

我能够将原始XML文件保存到文件系统中。 我可以打开XML文件,解码ZIP节点并保存到文件系统。 然后我就可以毫无问题地打开这个Zip文件了

我可以创建最终的ZIP文件,省略XML文件,ZIP文件就可以打开了

我似乎只在尝试压缩一个XML文件时遇到了一个问题,该文件的节点的压缩内容编码为BASE64字符串

有什么想法吗?代码如下。大量编辑

XDocument xDoc=new XDocument();
XDocument xDocReport=新XDocument();
XElement XnoderReport;
使用(FileStream fsData=newfilestream(strFullFilePath,FileMode.Open,FileAccess.Read)){
xDoc=XDocument.Load(fsData);
xNodeReport=xDoc.Element(“数据”).Element(“报告”).Element(“报告”);
//剪断
//创建XDocument xDocReport
//斯尼奥
使用(MemoryStream zipInMemoryReport=new MemoryStream()){
使用(ZipArchive-zipFile=new-ZipArchive(zipInMemoryReport,ZipArchiveMode.Update)){
//将报告添加到ZIP文件
ZipArchiveEntry entryReport=zipFile.CreateEntry(“data.xml”);
使用(StreamWriter=newstreamwriter(entryReport.Open())){
writer.Write(xDocReport.ToString());
}//结束使用报表条目
}
xNodeReport.Value=System.Convert.ToBase64String(zipInMemoryReport.GetBuffer());
//我能够将这个文件写入磁盘并操作它,没有问题。
//File.writealText(“c:\\users\\snip\\desktop\\Report.xml”,xDoc.ToString());
}
//为响应创建ZIP
使用(MemoryStream zipInMemory=new MemoryStream()){
使用(ZipArchive-zipFile=new-ZipArchive(zipInMemory,ZipArchiveMode.Update)){
//将报告添加到ZIP文件
ZipArchiveEntry entryReportWrapper=zipFile.CreateEntry(“Report.xml”);
//这是使Zip“无效”的步骤。尽管我可以打开并操作这个源文件,但没有问题。
//********
使用(StreamWriter writer=newstreamwriter(entryReportWrapper.Open())){
xDoc.Save(写入程序);
} 
//将JPEG添加到报告中
//创建图表
如果(chkDLSalesPrice.Checked){chartDownloadSP.SaveImage(entryChartSP.Open(),chartmageformat.Jpeg);}
如果(chkDLSalesDOM.Checked){chartDownloadDOM.SaveImage(entryChartDOM.Open(),ChartImageFormat.Jpeg);}
如果(chkDLSPLP.Checked){chartDownloadsPP.SaveImage(entrychartspp.Open(),ChartImageFormat.Jpeg);}
如果(chkDLSPLP.Checked){chartDownloadLP.SaveImage(entryChartLP.Open(),ChartImageFormat.Jpeg);}
}//结束使用ziparchive
Response.Clear();
AppendHeader(“内容处置”、“附件;文件名=file.zip”);
Response.ContentType=“应用程序/zip”;
BinaryWrite(zipInMemory.GetBuffer());
Response.End();
如果没有,就不可能确定代码中有哪些bug。但是在您发布的代码片段中至少有两个明显的错误,其中一个很容易导致“invalid.zip”错误:

  • 在语句
    writer.Write(xDocReport.ToString());
    中,变量
    xDocReport
    尚未初始化为任何有用的内容,至少在您发布的代码中没有。因此,您将在存档中得到一个空的XML文档
  • 由于代码示例不完整,您可能只是在问题的代码示例中忽略了将该变量初始化为其他变量。在任何情况下,即使您没有这样做,也只会导致存档中的XML文档为空,而不是无效存档

    但问题更大

  • 您正在对
    MemoryStream
    对象调用
    GetBuffer()
    ,而不是
    ToArray()
    。您想要后者。前者获取
    MemoryStream
    对象的整个备份缓冲区,包括超过有效流结尾的未初始化字节。由于有效的.zip文件在文件结尾包含CRC值,因此添加超出该值的额外数据会导致任何试图将文件作为.zip存档读取的操作都将丢失e更正CRC,改为读取未初始化的数据
  • 将对
    GetBuffer()
    的调用替换为对
    ToArray()
    的调用

    如果上述内容不能解决您的问题,您应该编辑您的帖子,以提供更好的代码示例



    最后一点注释:当您要用另一个对象(例如,通过调用
    XDocument.Load()
    )替换该对象时,将
    XDocument
    之类的变量初始化为空的
    XDocument
    对象是没有意义的.

    Hi Peter.关于我的代码示例,您在所有方面都完全正确。我很抱歉并感谢您仍然花时间查看代码示例。#1与我不完整的代码示例有关。所有变量都分配正确,我只需删除创建文档的代码页。我现在要测试您的观点#2。谢谢!!!ToArray()是解决方案。我非常感谢您在我未能提供完整代码示例时花费时间。谢谢!!!!