Pregunta

En todos mis servidores Windows, excepto en una máquina, cuando ejecuto el siguiente código para asignar una carpeta de archivos temporales:

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

La variable $tmpfile se le asigna el valor '.\CGItemp1' y esto es lo que quiero.Pero en uno de mis servidores está configurado incorrectamente en C:\temp\CGItemp1.

Todos los servidores ejecutan Windows 2003 Standard Edition, IIS6 y ActivePerl 5.8.8.822 (actualizar a una versión posterior de Perl no es una opción).El resultado es siempre el mismo cuando se ejecuta un script desde la línea de comandos o en IIS como un script CGI (donde scriptmap .pl = c:\perl\bin\perl.exe "%s" %s).

¿Cómo puedo arreglar esta instalación de Perl y forzar su regreso?.\CGItemp1' ¿por defecto?

Incluso copié toda la carpeta Perl de uno de los servidores en funcionamiento a esta máquina, pero no fue un placer.

@Hometost:

Revisé el 'TMP' y 'TEMP'variables de entorno y también $ENV{TMP} y $ENV{TEMP} y son identicos.

Desde la línea de comando apuntan al directorio del perfil del usuario, por ejemplo:

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

Cuando se ejecutan bajo IIS como un script CGI, ambos apuntan a:

c:\windows\temp

En clave de registro HKEY_USERS/.DEFAULT/Environment, ambos servidores tienen:

%USERPROFILE%\Local Settings\Temp

La implementación ActiveState de CGITempFile() claramente está utilizando un mecanismo alternativo para determinar cómo debe generar la carpeta temporal.

@Ranguardia:

El verdadero problema es con el CGI.pm Manejo de módulos y accesorios.Cada vez que se sube un archivo al sitio CGI.pm necesita almacenarlo en algún lugar temporal.Para hacer esto CGITempFile() se llama dentro CGI.pm para asignar una carpeta temporal.Desafortunadamente no puedo usar File::Temp.Gracias de cualquier manera.

@Chris:

Eso ayudó mucho.Hice un escaneo rápido a través del CGI.pm fuente anterior, pero su sugerencia me hizo volver atrás y mirarla más detenidamente para comprender el algoritmo subyacente.Conseguí que todo funcionara, pero lo más extraño es que originalmente no había c:\temp carpeta en el servidor.

Para obtener una solución temporal, creé un c:\temp carpeta y establezca los permisos relevantes para la cuenta de usuario anónimo del sitio web.Pero como se trata de un cuadro compartido, no podía dejar las cosas así, aunque los archivos temporales se estuvieran eliminando.Para abreviar la historia, cambié el nombre de c:\temp carpeta a algo diferente y mágicamente el correcto '.\' Se estaba devolviendo la ruta de la carpeta.También noté que el cliente había habilitado las extensiones de FrontPage en el sitio, lo que elimina el acceso de escritura para la cuenta de usuario anónimo en las carpetas del sitio web, por lo que era necesario volver a aplicar este permiso.Todavía no sé por qué al comienzo de este número. CGITempFile() estaba volviendo c:\temp, aunque esa carpeta no existía, y por qué mágicamente empezó a funcionar de nuevo.

¿Fue útil?

Solución

El nombre del directorio temporal se guarda en $CGITempFile::TMPDIRECTORY e inicializado en el find_tempdir función en CGI.pm.El algoritmo para elegir el directorio temporal se describe en la documentación CGI.pm (busque -archivos_temp_privados).IIUC, si existe una carpeta C: emp en el servidor, CGI.pm la usará.Si ninguno de los directorios se registró find_tempdir existir, luego el directorio actual "." se usa.

Espero que esto ayude.

Otros consejos

No es la respuesta directa a tu pregunta, pero ¿has intentado usar? Archivo::Temperatura?

Está diseñado específicamente para funcionar en cualquier sistema operativo.

Si está ejecutando este script como lo hace, verifique la variable de entorno %TEMP% para ver si difiere.

Si IIS se está ejecutando, verifique los valores en Registro para TMP y TEMP en HKEY_USERS/.DEFAULT/MODAY

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top