powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - создать zip без использования файлов
5 сообщений из 5, страница 1 из 1
Perl - создать zip без использования файлов
    #39082023
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть код на Perl, который по email отправляет письмо с прикрепленными текстовыми файлами (файлы генерируются динамически, без сброса на диск).
Код примерно такой:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
my $smtp = Net::SMTPS->new(...);
$smtp->datasend("--$boundary\n");
$smtp->datasend("Content-Type: text/plain; charset=utf-8\n");
$smtp->datasend("Content-Transfer-Encoding: base64\n");
$smtp->datasend("\n");
$smtp->datasend($_) foreach (unpack("(A3800)*", $body));
$smtp->datasend("\n\n");
foreach my $f (@$file)
{
	$smtp->datasend("--$boundary\n");
	my ($data,$type);
	if (exists($f->{'mimetype'}))
	{
		$data = $f->{'data'};
		$type = $f->{'mimetype'};
	}
	else
	{
		$data = encode('UTF-8',$f->{'data'});
		$type = "application/text";
	}
	$smtp->datasend("Content-Type: " . encode('MIME-Header', "$type; name=$f->{'filename'}") . "\n");
	$smtp->datasend("Content-Transfer-Encoding: base64\n");
	$smtp->datasend("Content-Disposition: " . encode('MIME-Header', "attachment; filename=$f->{'filename'}") . "\n");
	$smtp->datasend("\n");
	$smtp->datasend($_) foreach (unpack("(A3800)*", encode_base64($data)));
	$smtp->datasend("\n\n");
}
$smtp->datasend("\n");
$smtp->dataend();
$smtp->quit;


Иногда файлов оказывается много (несколько десятков).
И хотелось бы эти файлы упаковать в zip, также без сброса на диск.
Подскажите, чем это лучше сделать?
В Archive::Zip файлы в архив можно добавлять из строковой переменной. Но вот как сам zip-файл держать в переменной я не нашел.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl - создать zip без использования файлов
    #39082045
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел пример в examples/readScalar.pl.
...
Рейтинг: 0 / 0
Perl - создать zip без использования файлов
    #39082057
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственный вопрос.
Добавляю файлы в архив таким образом:
Код: php
1.
	$zip->addString($_->{'data'}, $_->{'filename'})->desiredCompressionMethod(COMPRESSION_DEFLATED) foreach (@$file);


Но файлы у меня UTF-8 и я получаю сообщение Wide character in Compress::Raw::Zlib::crc32.
Как вместо юникодных строк добавить байты?
...
Рейтинг: 0 / 0
Perl - создать zip без использования файлов
    #39082069
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подключил Encode и сделал так:
Код: php
1.
$zip->addString(encode_utf8($_->{'data'}), $_->{'filename'})->desiredCompressionMethod(COMPRESSION_DEFLATED) foreach (@$file);


Немного костыльно, но похоже по другому тут не сделать.
Пробовал использовать прагму use bytes, но почему-то не помогло.
...
Рейтинг: 0 / 0
Perl - создать zip без использования файлов
    #39083056
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос.
Делаю так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
...
	if (defined($file) && @$file && $archive)
	{
		my $zip = Archive::Zip->new();
		my $zb = '';
		my $zh = IO::String->new($zb);
		$zip->addString(encode_utf8($_->{'data'}), $_->{'filename'})->desiredCompressionMethod(COMPRESSION_DEFLATED) foreach (@$file);
		$zip->writeToFileHandle($zh);
		$file = [{'filename'=>"report.zip", 'mimetype'=>"application/zip", 'data'=>$zb}];
	}
...
		foreach my $f (@$file)
		{
			$smtp->datasend("--$boundary\n");
			my ($data,$type);
			if (exists($f->{'mimetype'}))
			{
				$data = $f->{'data'};
				$type = $f->{'mimetype'};
			}
			else
			{
				$data = encode('UTF-8',$f->{'data'});
				$type = "application/text";
			}
			$smtp->datasend("Content-Type: " . encode('MIME-Header', "$type; name=$f->{'filename'}") . "\n");
			$smtp->datasend("Content-Transfer-Encoding: base64\n");
			$smtp->datasend("Content-Disposition: " . encode('MIME-Header', "attachment; filename=$f->{'filename'}") . "\n");
			$smtp->datasend("\n");
			$smtp->datasend($_) foreach (unpack("(A3800)*", encode_base64($data)));
			$smtp->datasend("\n\n");
		}
...


Но в этом коде время от времени может вылезать ошибка Wide character на строке encode_base64($data).

ZIP-файл сбрасывается в буфер $zb. Видимо нужно как-то указать, что это не UTF-8, а байтовый массив.
Я пробовал делать 'data'=>encode_utf8($zb), но не помогло.
Пробовал использовать use bytes, тоже не помогло.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - создать zip без использования файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]