Archive :: Zip, EBook :: Epub и IIS6 - ошибка «требуемый уровень сжатия» - PullRequest
4 голосов
/ 30 апреля 2011

Я пытаюсь преобразовать html-файлы в epub с помощью EBook :: Epub.Сценарий, который я написал, очень прост, например:

my $epub = EBook::EPUB->new;
$epub->add_title('title');
$epub->add_author('author');
$epub->add_language('en');
$epub->copy_xhtml("d:/path/to/file.html" , "file.html");
$epub->pack_zip("d:/path/to/file.epub");

Когда я запускаю его из командной строки, он прекрасно работает.Тем не менее, я пытаюсь развернуть его как сценарий CGI на сервере IIS6 - который запускается с компьютера того же - не получается с этим сообщением:

Can't call method "desiredCompressionLevel" on an undefined value at C:/strawberry/perl/vendor/lib/Archive/Zip/Archive.pm line 252.

Я проверилout Archive.pm, а строка 252 находится в sub addFile.Он использует три переменные - $ fileName, $ newName, $ compressLevel - и я использовал некоторые операторы print, чтобы показать их значения прямо перед строкой 252. ($ressionLevel всегда пусто)

Это из командыстрока, которая работает:

filename: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\7QiqzzNiN5/OPS/file.html 
newname: OPS/Advanced8247.html
filename: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\7QiqzzNiN5/OPS/content.opf 
newname: OPS/content.opf
filename: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\7QiqzzNiN5/OPS/toc.ncx 
newname: OPS/toc.ncx
filename: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\DkgiQN_pTq 
newname: META-INF/container.xml

Это с сервера, который бомбит:

filename: C:\WINDOWS\TEMP\8rxbvOVkKy/OPS/file.html 
newname: OPS/Advanced6575.html
filename: C:\WINDOWS\TEMP\8rxbvOVkKy/OPS/content.opf 
newname: OPS/content.opf
filename: C:\WINDOWS\TEMP\8rxbvOVkKy/OPS/toc.ncx 
newname: OPS/toc.ncx
filename: C:\WINDOWS\TEMP\WqS7fskWi0 
newname: META-INF/container.xml

Так что я предполагаю, что моя проблема связана с тем, где находятся временные файлынаписано, но я действительно не знаю достаточно о серверах и Archive :: Zip, чтобы понять это.Есть идеи?

1 Ответ

0 голосов
/ 02 июня 2011

Убедитесь, что записываемый временный каталог доступен для записи пользователю IIS, от имени которого работает IIS (IIS_IUSRS и / или IUSR). Когда вы запускаете из командной строки, вы работаете как другой пользователь, у которого, вероятно, есть права на запись в C: \ Windows \ Temp. У меня была похожая проблема (запись в тот же временный каталог), и я смог ее исправить, изменив временный каталог на более локальный, чем корневой каталог опубликованного документа моего веб-приложения, у которого уже были правильные разрешения в разделе Свойства> Безопасность.

В моей ситуации мне удалось установить переменную окружения TMPDIR в моем сценарии:

$ENV{TMPDIR} = 'C:\Inetpub\tmp'

и разрешения для папки C: \ Inetpub \ tmp были обновлены для возможности записи IIS_IUSRS и IUSR.

Вот фрагмент из http://metacpan.org/pod/Archive::Zip, в котором говорится о временных файлах и настройке $ ENV {TMPDIR}

Archive::Zip::tempFile( [$tmpdir] )

Create a uniquely named temp file. It will be returned open for read/write. If $tmpdir
is given, it is used as the name of a directory to create the file in. If not given, 
creates the file using File::Spec::tmpdir(). Generally, you can override this choice
using the

    $ENV{TMPDIR}

environment variable. But see the File::Spec documentation for your system. Note that 
on many systems, if you're running in taint mode, then you must make sure that 
$ENV{TMPDIR} is untainted for it to be used. Will NOT create $tmpdir if it doesn't 
exist (this is a change from prior versions!). Returns file handle and name:

    my ($fh, $name) = Archive::Zip::tempFile();
    my ($fh, $name) = Archive::Zip::tempFile('myTempDir');
    my $fh = Archive::Zip::tempFile();  # if you don't need the name
...