[Moscow.pm] Mojolicious render xls

Alexander Lourier aml на rulezz.ru
Чт Мар 20 03:09:06 PDT 2014


Тогда - только архив. HTTP не поддерживает multipart-ответы.
Можно ещё показать HTML-страничку, с которой можно каждый файл по
отдельности кликом открыть.

И ещё. Вы небезопасно используете временный файл для генерации XLS. Если
два пользователя попытаются выполнить такую операцию, то одному может
достаться файл от другого или его битый кусок. Если в вашем случае возможно
генерировать файл в памяти, то лучше сделать именно так:

my $xls_data;
my $handle = IO::Scalar->new(\$xls_data);
my $workbook = Spreadsheet::WriteExcel->new($handle);
....
$workbook->close;
$self->render(data => $xls_data);


20 марта 2014 г., 9:24 пользователь Artem Zhuravlev
<zhuravlev.ua на gmail.com>написал:

> Файлы через веб, загрузка клиентом.
>
>
> 20 марта 2014 г., 12:10 пользователь Alexander Lourier <aml на rulezz.ru>написал:
>
> Зависит от того, что такое $self->res, и как вы хотите отдавать файлы.
>> Если вы формируете email, то Content-type самому письму задаёте
>> multipart/mixed, потом к письму цепляете каждый аттач отдельным part. Если
>> это MIME::Entity, то примерно так:
>> $self->res->attach(Data => $document, Type => 'application/vnd.ms-excel',
>> Encoding => 'base64');
>> $self->res->attach(....);
>>
>>
>>
>> 2014-03-20 8:54 GMT+01:00 Artem Zhuravlev <zhuravlev.ua на gmail.com>:
>>
>>>
>>>
>>> Добрый день.
>>>
>>> Столкнулся с проблемой рендеринга xls файлов.
>>>
>>> my $self = shift;
>>> my $dir = "/tmp/writeexcel/";
>>> my $template = "application";
>>> my $suffix = ".xls";
>>>
>>> my $filename = $dir . $template . $suffix;
>>> # Create a new workbook called simple.xls and add a worksheet
>>> my $workbook;
>>> $workbook  = Spreadsheet::WriteExcel->new($filename) or die "Problems
>>> creating new Excel file: $!" unless defined $workbook;
>>> my $worksheet = $workbook->add_worksheet("Заявка");
>>> ... формируем xls файл ...
>>> $workbook->close() or die "Error closing file: $!";
>>>
>>> my $document = do {
>>>  local $/ = undef;
>>> open my $fh, "<", $filename
>>> or die "could not open $filename: $!";
>>>  <$fh>;
>>> };
>>>
>>> $self->res->headers->content_disposition("attachment;
>>> filename='file.xls';");
>>> $self->render(data => $document);
>>>
>>> Тут все хорошо.
>>>
>>> Не знаю как быть в случае если нужно отдать сразу несколько файлов.
>>>
>>> Пните куда смотреть. Думал над тем что архивировать файлы и передать
>>> архив.
>>>
>>> Спасибо.
>>>
>>> P.S.  Суть не в самом решении, конечно не буду против, а в том куда
>>> копать.
>>>
>>> --
>>> Best regards,
>>> Artem V. Zhuravlev
>>>
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>>>
>>>
>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>
>
> --
> Best regards,
> Artem V. Zhuravlev
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20140320/5e299b2f/attachment.html>


Подробная информация о списке рассылки Moscow-pm