Estoy creando un sitio web donde los usuarios pueden descargar varios datos de programas y secuencias de comandos utilizados en esos datos. Me pregunto si es posible descargar un script de Python directamente. O tengo que cerrar la cremallera o algo?
En este momento, enumero cada script de python asociado con un programa como un enlace para descargar. Sin embargo, el navegador dice "Error: problema del servidor" cuando hago clic en el enlace. Usé un archivo csv de prueba en lugar de uno de los scripts de Python (en la misma carpeta en el servidor) y se descargó correctamente, por lo que tengo acceso a la carpeta donde están los scripts.
Solo busco confirmar: ¿no es posible descargar un script de python directamente?
Aquí está el código en caso de que sea útil:
var site_url = "<?php echo site_url();?>"; var timestamp=""; var scriptsrendered='<table class="table table-striped">'; i=0; while (i<v.scripts.length) { if (v.scripts[i].fldTimestamp===null) { timestamp ="unknown date"; } else { timestamp=new Date(parseInt(v.scripts[i].fldTimestamp)*1000); } scriptsrendered+='<tr><td style="width:150px;">'+timestamp+'</td>'; scriptsrendered+='<td><a href="'+site_url+"nefin-temp/nefin_scripts/"+v.scripts[i].fldFileName+'" download="'+v.scripts[i].fldFileName+'">'+v.scripts[i].fldFileName+'</a></td></tr>'; i++; } scriptsrendered+='</table>'; $('#programScripts').html(scriptsrendered);Editar:
No veo nada en la consola del navegador en cuanto a errores. Los registros de PHP también están limpios. El registro de errores de Apache tiene:
[Wed Jun 08 13:26:37.729794 2022] [fcgid:warn] [pid 65316:tid (104)Connection reset by peer: [client 132.198.100.190:38728] [request de6efb774b83e68d900a90abb805c0d9] mod_fcgid: error reading data from FastCGI server, referer https://dev.vmc.w3.uvm.edu/nefin-xana/extractor [Wed Jun 08 13:26:37.729823 2022] [core:error] [pid 65316:tid [client 132.198.100.190:38728] [request de6efb774b83e68d900a90abb805c0d9] End of script output before headers: FEMCFHM_munger.py, referer https://dev.vmc.w3.uvm.edu/nefin-xana/extractorEl archivo es pequeño, por lo que no debería ser un problema de tiempo de espera. Veré si puedo averiguar si el tipo de archivo está bloqueado para descargar en algún lugar...
Usando el código de esta respuesta ( Cómo forzar la descarga de archivos con PHP ) combinado con un simple ajuste de htaccess, no necesita actualizar la página.
Cree un archivo php llamado downloader.php con el siguiente código. Querrá hacer una verificación de archivos para asegurarse de que están cargando los archivos correctos, pero para este ejemplo, esto debería funcionar.
Modificó la descripción de la respuesta original:
En el siguiente ejemplo, obtenemos el nombre del archivo a través de la cadena de consulta. php://output es un flujo de solo escritura (generalmente utilizado por echo o print). después de eso, solo necesita configurar los encabezados requeridos y llamar a stream_copy_to_stream (origen, destino). El método stream_copy_to_stream() actúa como una tubería que toma la entrada de la secuencia de origen (secuencia de lectura) y la canaliza a la secuencia de destino (secuencia de escritura) y también evita el problema de agotamiento de la memoria permitida para que pueda descargar archivos que son más grandes que tu PHP memory_limit.
$file = $_GET["file"]; $readableStream = fopen('nefin-temp/nefin_scripts/$page', 'rb'); $writableStream = fopen('php://output', 'wb'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="$file"'); stream_copy_to_stream($readableStream, $writableStream); ob_flush(); flush();Luego, en su htaccess, agregue la siguiente línea.
RewriteRule ^nefin-temp/nefin_scripts/(.*)$ downloader.php?file=$2 [L]Esto forzará que los archivos de su carpeta de scripts se carguen en el archivo downloader.php.
En lugar de htaccess, también puede simplemente actualizar sus enlaces de la siguiente manera:
cambie nefin-temp/nefin_scripts/ en las URL a downloader.php?file= y siga usando downloader.php