2011-04-29 48 views
4

我試圖將HTML文件轉換爲EPUB與EBook ::電子數據交換。我寫劇本是很簡單的,就像這樣:存檔::郵編,電子郵件::電子數據交換和IIS6 - 「desiredCompressionLevel」錯誤

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"); 

當我運行此命令行,它的偉大工程。但是,我想將其部署爲IIS6服務器上的CGI腳本 - 它運行斷相同計算機 - 失敗此消息:

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

我檢查了Archive.pm,和第252行在sub addFile中。它使用了三個變量 - $文件名,$了newName,$ compressionLevel - 我用了一些打印語句從右側前行252($ compressionLevel始終是空白)顯示其值的

這是在命令行中,它的工作原理:

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瞭解不多。有任何想法嗎?

回答

0

確保正在寫入的臨時目錄可由IIS用戶運行(IIS_IUSRS和/或IUSR)寫入。當您在命令行上運行時,您作爲可能有權寫入C:\ Windows \ Temp的不同用戶運行。我有一個類似的問題(寫入同一個臨時目錄),並能夠通過將temp目錄更改爲我的Web應用程序的已發佈文檔根目錄的更本地的東西來解決問題,該應用程序已在「屬性」>「安全」下具有正確的權限。

在我的情況,我可以設置環境變量,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