Ошибка в архиве :: Zip, электронная книга :: Epub и IIS6 — «Желаемый уровень сжатия»

#perl #iis-6 #zip #epub

#perl #iis-6 #zip #epub

Вопрос:

Я пытаюсь конвертировать 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.
  

Я проверил Archive.pm, а строка 252 находится в дополнительном файле. Он использует три переменные — $fileName, $ newName, $ CompressionLevel — и я использовал некоторые операторы печати, чтобы показать их значения прямо перед строкой 252. (значение $CompressionLevel всегда пустое)

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

 filename: C:DOCUME~1ADMINI~1LOCALS~1Temp7QiqzzNiN5/OPS/file.html 
newname: OPS/Advanced8247.html
filename: C:DOCUME~1ADMINI~1LOCALS~1Temp7QiqzzNiN5/OPS/content.opf 
newname: OPS/content.opf
filename: C:DOCUME~1ADMINI~1LOCALS~1Temp7QiqzzNiN5/OPS/toc.ncx 
newname: OPS/toc.ncx
filename: C:DOCUME~1ADMINI~1LOCALS~1TempDkgiQN_pTq 
newname: META-INF/container.xml
  

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

 filename: C:WINDOWSTEMP8rxbvOVkKy/OPS/file.html 
newname: OPS/Advanced6575.html
filename: C:WINDOWSTEMP8rxbvOVkKy/OPS/content.opf 
newname: OPS/content.opf
filename: C:WINDOWSTEMP8rxbvOVkKy/OPS/toc.ncx 
newname: OPS/toc.ncx
filename: C:WINDOWSTEMPWqS7fskWi0 
newname: META-INF/container.xml
  

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

Ответ №1:

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

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

 $ENV{TMPDIR} = 'C:Inetpubtmp'
  

и разрешения папки для C:Inetpubtmp были обновлены, чтобы быть доступными для записи с помощью 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