Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - создать zip без использования файлов / 5 сообщений из 5, страница 1 из 1
21.10.2015, 09:30
    #39082023
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - создать zip без использования файлов
У меня есть код на 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
21.10.2015, 09:50
    #39082045
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - создать zip без использования файлов
Нашел пример в examples/readScalar.pl.
...
Рейтинг: 0 / 0
21.10.2015, 10:01
    #39082057
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - создать zip без использования файлов
Единственный вопрос.
Добавляю файлы в архив таким образом:
Код: php
1.
	$zip->addString($_->{'data'}, $_->{'filename'})->desiredCompressionMethod(COMPRESSION_DEFLATED) foreach (@$file);


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


Немного костыльно, но похоже по другому тут не сделать.
Пробовал использовать прагму use bytes, но почему-то не помогло.
...
Рейтинг: 0 / 0
22.10.2015, 09:27
    #39083056
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - создать zip без использования файлов
Еще вопрос.
Делаю так:
Код: 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
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - создать zip без использования файлов / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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