2008-09-17 9 views
2

Sur tous mes serveurs Windows, à l'exception d'une machine, quand j'exécute le code suivant pour attribuer un dossier de fichiers temporaires:Où CGI.pm crée-t-il normalement des fichiers temporaires?

use CGI; 
my $tmpfile = new CGITempFile(1); 
print "tmpfile='", $tmpfile->as_string(), "'\n"; 

La $tmpfile variable est affectée la valeur '.\CGItemp1' et c'est ce que je veux. Mais sur l'un de mes serveurs, il est incorrectement défini sur C:\temp\CGItemp1.

Tous les serveurs exécutent Windows 2003 Standard Edition, IIS6 et ActivePerl 5.8.8.822 (la mise à niveau vers une version ultérieure de Perl n'est pas une option). Le résultat est toujours le même lors de l'exécution d'un script à partir de la ligne de commande ou dans IIS en tant que script CGI (où scriptmap .pl = c:\perl\bin\perl.exe "%s" %s).

Comment est-ce que je peux réparer cette installation de Perl et la forcer à renvoyer '.\CGItemp1' par défaut?

J'ai même copié tout le dossier Perl de l'un des serveurs de travail sur cette machine mais pas de joie.

@Hometoast:

j'ai vérifié l'environnement 'TMP' et '' TEMP des variables ainsi $ENV{TMP} et $ENV{TEMP} et ils sont identiques.

ligne de commande qu'ils pointent vers le répertoire du profil de l'utilisateur, par exemple:

C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp\1

Lorsqu'il est exécuté sous IIS en tant que script CGI ils pointent tous deux vers:

c:\windows\temp

aux deux serveurs clé de Registre HKEY_USERS/.DEFAULT/Environment,:

%USERPROFILE%\Local Settings\Temp

La mise en œuvre de ActiveState CGITempFile() utilise clairement un mécanisme alternatif pour déterminer comment il doit générer le dossier temporaire.

@Ranguard:

Le vrai problème est avec le module CGI.pm et gestion des pièces jointes. Chaque fois qu'un fichier est téléchargé sur le site CGI.pm doit le stocker quelque part temporaire. Pour ce faire, CGITempFile() est appelée dans CGI.pm pour allouer un dossier temporaire. Donc, malheureusement, je ne peux pas utiliser File::Temp. Merci quand même.

@Chris:

Cela a aidé un groupe. J'ai fait un balayage rapide à travers la source CGI.pm plus tôt mais votre suggestion m'a incité à revenir en arrière et à le regarder plus studieusement pour comprendre l'algorithme sous-jacent. J'ai fait fonctionner les choses, mais la chose la plus étrange est qu'il n'y avait à l'origine aucun dossier c:\temp sur le serveur.

Pour obtenir une correction temporaire, j'ai créé un dossier c:\temp et défini les autorisations appropriées pour le compte d'utilisateur anonyme du site Web. Mais parce que c'est une boîte partagée je ne pouvais pas laisser les choses de cette façon, même si les fichiers temporaires étaient supprimés. Pour raccourcir une histoire courte, j'ai renommé le dossier c:\temp à quelque chose de différent et magiquement le bon chemin du dossier '.\' a été retourné. J'ai également remarqué que le client avait activé les extensions FrontPage sur le site, ce qui supprime l'accès en écriture pour le compte d'utilisateur anonyme sur les dossiers du site Web. Cette autorisation devait donc être réappliquée. Je ne comprends toujours pas pourquoi au début de ce numéro CGITempFile() retournait c:\temp, même si ce dossier n'existait pas, et pourquoi il a magiquement recommencé à fonctionner.

Répondre

8

Le nom du répertoire temporaire est tenu à $CGITempFile::TMPDIRECTORY et initialisés dans la fonction find_tempdir dans CGI.pm . L'algorithme de choix du répertoire temporaire est décrit dans la documentation CGI.pm (recherchez -private_tempfiles). IIUC, si un dossier C: \ Temp existe sur le serveur, CGI.pm l'utilisera. Si aucun des répertoires cochés en find_tempdir n'existe, le répertoire en cours "." est utilisé.

J'espère que cela aide.

1

Si vous exécutez ce script comme vous, vérifiez la variable d'environnement% TEMP% pour voir si elle diffère.

Si IIS est en cours d'exécution, vérifiez les valeurs dans le registre de TMP et TEMP sous HKEY_USERS /DEFAULT/Environnement

2

Pas la réponse directe à votre question, mais avez-vous essayé d'utiliser File::Temp?

Il est spécialement conçu pour fonctionner sur n'importe quel OS.

Questions connexes