Perl Archive::Zip Issue. Zip文件在对“large”文件使用addString时变得不可用

q5iwbnjs  于 2023-10-24  发布在  Perl
关注(0)|答案(2)|浏览(135)

所以我有一个Perl系统,它可以将电子邮件分成JSON文件和附件,然后压缩它们。我的过程非常好,但是我注意到,当输入附件超过大约10 MB时,输出zip文件(使用Archive::Zip创建)实际上是无效的。
我的代码是:

my $zip = Archive::Zip->new();
$count = 0;
foreach $attachment (@atachments) {
   my $member = $zip->addString(@attachments[$count], @attachment_names[$count])
   $member->desiredCompressionMethod( COMPRESSION_STORED );
   $count++;
}
my $jsonMember = $zip->addString($json, $fn . '.json')
$jsonMember->desiredCompressionMethod( COMPRESSION_STORED );

unless ( $zip->writeToFileNamed($out) == AZ_OK ) {
    die 'zip error';
}

所以这对于小于10 MB的东西完全可以工作,但是随机每当附件超过10 MB时,它就会停止工作.输出zip文件在Windows中被认为比我认为的要小,并且zip文件无法打开/解压缩。
我试过升级Archive::Zip到1. 68版本,但没有运气。我试过不同的压缩级别,也没有运气。
字符串本身是好的,我可以验证它的所有在那里.但我想知道是否有人知道如果addString有一个潜在的字符串限制的地方。
它可能会根据文件大小改变zip类型吗?我在网上看到一些关于zip 64的东西,但只有在4GB之后才提到。
任何帮助将不胜感激。

rkue9o1l

rkue9o1l1#

您的代码无法编译-某些行的末尾缺少一些字符串。
这是一个独立运行的修改版本。

#!/usr/bin/perl

use strict;
use warnings;

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

my $out = "test.zip";
my @attachments = ('alpha'  x (1024 * 1024 * 10), # create a large file
                   'beta'   x (1024 * 1024 * 10), # create a large file,
                   'gaamma' x (1024 * 1024 * 10), # create a large file
                  );

my @attachment_names = ('name1', 'name2', 'name3');

my $zip = Archive::Zip->new();

for my $count (0 .. @attachments -1) {
   my $member = $zip->addString($attachments[$count], $attachment_names[$count]) ;
   $member->desiredCompressionMethod( COMPRESSION_STORED );
}

my $json = 'json';
my $fn = 'something';
my $jsonMember = $zip->addString($json, $fn . '.json') ;
$jsonMember->desiredCompressionMethod( COMPRESSION_STORED );

unless ( $zip->writeToFileNamed($out) == AZ_OK ) {
    die 'zip error';
}

运行它会生成一个名为test.zip的文件。

$ unzip -l test.zip 
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
 52428800  2023-10-10 15:54   name1
 41943040  2023-10-10 15:54   name2
 62914560  2023-10-10 15:54   name3
        4  2023-10-10 15:54   something.json
---------                     -------
157286404                     4 files

zip文件有效

$ unzip -t test.zip 
Archive:  test.zip
    testing: name1                    OK
    testing: name2                    OK
    testing: name3                    OK
    testing: something.json           OK
No errors detected in compressed data of test.zip.

对于Archive::Zip来说,一个10兆大小的文件是完全正常的文件。

  • 单个文件> 4Gig
  • 单个条目小于4 gig,但zip文件的组合大小> 4 gig
  • zip文件中有超过64 k的条目

如果这些都不适用,那么问题就出在别处&您需要提供一个可重现的示例。

w80xi6nr

w80xi6nr2#

感谢pmqs的时间来回答我的问题,不幸的是,这实际上是我有点愚蠢。
因此,我让Apache NiFi从$out目录中提取文件,并设置为允许文件的最小文件年龄为0秒(我的想法是我不认为我需要添加不自然的延迟)。
我猜Zip::Archive在处理较大文件时可能会分块写入目录,这会触发我的NiFi服务器抢先拉取文件进行处理,并删除zip。
我已经设置了一个最小的文件年龄为2s,它已经解决了这个问题。

相关问题