【问题标题】:How do I get files from zipped folder and encode and save them to database without extracting the files?如何从压缩文件夹中获取文件并编码并将它们保存到数据库而不提取文件?
【发布时间】:2019-05-07 13:21:01
【问题描述】:

服务器有将近 50 GB 的压缩文件。我需要一种最佳方法来从这些压缩文件夹中提取文件,并对它们进行 base 64 编码并将它们作为 blob 保存到数据库中。如果可能,我不希望提取整个压缩文件夹。 请指导我。

【问题讨论】:

  • 查看 ZipArchive 文档中给出的(第二个)示例:docs.microsoft.com/en-us/dotnet/api/…。但是不要让 Zip 文件条目的(未压缩)流被写入文件(如示例那样),只需 take the stream object of the uncompressed ZIP entry 并随心所欲地处理它(如从中读取,将其交给 base64 编码器您的选择,挑战它参加饮酒比赛等...)
  • 请注意,从技术上讲,您最终必须解压缩数据 - 除非您想将压缩内容存储在数据库中。但是,您可以按照@elgonzo 的建议“在内存中”执行此操作,因此不会产生首先将文件写入磁盘的开销,然后您无论如何都会重新读取。
  • 我会试着让你知道我是否卡住了。谢谢。
  • 您所要求的实际上是三个离散操作的组合:将压缩文件提取到内存、base64 编码流/数组以及将 base64 字符串保存到数据库。您是否查看过与这些单独操作相关的现有问题?您尝试实施了哪些操作,您遇到了哪些问题?您是否有足够的 RAM 来存储压缩存档中最大文件大小的 233%(二进制文件 + base64 文件 + base64 开销)?此外,如果您能指出您正在使用的数据库,将会很有帮助。
  • 我被困在其他任务中。我还没有开始这个。我正在使用 MS Sql Db。我愿意接受任何建议。我从来没有处理过这样的任务。

标签: c# .net database encode


【解决方案1】:

尝试以下方法:

using System;
using System.IO;
using System.IO.Compression;
using System.Threading.Tasks;

namespace zipStream
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var file = File.OpenRead(@"YOUR-REMOTE-FILE-NAME");
            ZipArchive ar = new ZipArchive(file, ZipArchiveMode.Read);
            foreach (ZipArchiveEntry entry in ar.Entries)
            {
                using (Stream stream = entry.Open())
                {
                    try
                    {
                        Byte[] inArray = new Byte[(int)entry.Length];
                        Char[] outArray = new Char[(int)((entry.Length + 10) * 2)];
                        stream.Read(inArray, 0, (int)entry.Length);
                        Convert.ToBase64CharArray(inArray, 0, inArray.Length, outArray, 0);
                        Console.WriteLine($"Processed {entry.Name}");
                    }
                    catch (Exception e)
                    {
                        var msg = e.Message;
                        Console.WriteLine($"Failed to process {entry.Name}");
                        System.Diagnostics.Debugger.Break();
                    }
                }
                // at this point you have your file content in outArray variable
                // you can find some guidance on writing blobs to a db here:
                // https://www.c-sharpcorner.com/uploadfile/Ashush/working-with-binary-large-objects-blobs/
            }

        }

    }
}

【讨论】:

  • 我遇到了一些 zip 文件中有内部 zip 文件的情况。我该如何处理这种情况?
猜你喜欢
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2023-04-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多