#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