所以我有一个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之后才提到。
任何帮助将不胜感激。
2条答案
按热度按时间rkue9o1l1#
您的代码无法编译-某些行的末尾缺少一些字符串。
这是一个独立运行的修改版本。
运行它会生成一个名为
test.zip
的文件。zip文件有效
对于
Archive::Zip
来说,一个10兆大小的文件是完全正常的文件。如果这些都不适用,那么问题就出在别处&您需要提供一个可重现的示例。
w80xi6nr2#
感谢pmqs的时间来回答我的问题,不幸的是,这实际上是我有点愚蠢。
因此,我让Apache NiFi从
$out
目录中提取文件,并设置为允许文件的最小文件年龄为0秒(我的想法是我不认为我需要添加不自然的延迟)。我猜Zip::Archive在处理较大文件时可能会分块写入目录,这会触发我的NiFi服务器抢先拉取文件进行处理,并删除zip。
我已经设置了一个最小的文件年龄为2s,它已经解决了这个问题。