【问题标题】:Downloaded PDFs in .zip are corrupt以 .zip 格式下载的 PDF 已损坏
【发布时间】:2016-08-16 18:22:37
【问题描述】:

我为供应商创建了一个 HTML5 在线门户,他们可以在其中上传和下载任意数量的文件。不幸的是,我不允许向您展示屏幕截图。但问题是: 如果上传了 2 个或更多文件,则程序应创建一个包含所有 PDF 的 .zip 文件。它被正确创建并且文件都在里面,但是它们已损坏,这意味着我无法打开它们。除此之外,他们的文件大小为 1 KB。

String zipFile = String.Format(@"{0}.zip", Guid.NewGuid());
String zipPath = String.Format(@"{0}\{1}", Data.Properties.Settings.Default.DownloadPath, zipFile);


using (FileStream zipToOpen = new FileStream(zipPath, FileMode.CreateNew))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
    {
        using (SqlConnection con = new SqlConnection(Data.Properties.Settings.Default.SelectionTMPDatabase))
        {
            con.Open();

            using (SqlCommand cmd = new SqlCommand(String.Format("SELECT [FileName], [File] FROM {0} WHERE [DownloadId] = @downloadId", Data.Properties.Settings.Default.SelectionFileDatabaseTable), con))
            {
                cmd.Parameters.AddWithValue("@downloadId", downloadID);

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        if (dr["FileName"] != null && dr["FileName"] != DBNull.Value && fileNames.Contains(dr["FileName"].ToString()))
                        {
                            ZipArchiveEntry entry = archive.CreateEntry(dr["FileName"].ToString());

                            using (StreamWriter writer = new StreamWriter(entry.Open()))
                            {
                                writer.Write((byte[])dr["File"]);
                            }

这是创建 .zip 的部分。我希望你能帮帮我!有什么问题就问吧!

【问题讨论】:

  • 我会首先重构以减少嵌套。拆分从数据库中检索数据并将其写入文件
  • 你确定dr["File"]中的字节数组包含所有字节吗?

标签: c# html pdf zip


【解决方案1】:

您正在创建一个空的 zip 条目,然后将“文件”列的内容写入其中 - 这真的是您打算做的吗?

你如何获得dr["FileName"]的完整路径然后简单地做

archive.CreateEntryFromFile(dr["fileName"], fullPathToFile);

【讨论】:

  • 是的,这就是我想要的。几个月前我使用了这种方法,它正确地创建了所有内容。顺便说一句,没有CreateEntryFromFile-method。
  • msdn.microsoft.com/en-us/library/hh485720(v=vs.110).aspx,需要导入System.IO.Compression。我会检查您是否可以直接从文件数据创建 PDF 文件,因为我想数据库或 DataReader 编码会混淆一些字符。
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多