Autor Tema: envio de archivos y javascript  (Leído 13174 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado kerberoz

  • The Communiter-
  • *
  • Mensajes: 3713
envio de archivos y javascript
« : junio 18, 2006, 11:44:43 am »
Bueno esta vez estoy intentando subir archivos a un servidor con php, la parte de php furula bien todo de maraville, la onda es ke kiero comprobar con javascript el tipo de archivo y su tamaño para no dejar ke suban ficheros muy grandes o que no sean imagenes. ¿se puede controlar esto desde javascript?.  :huh: :huh:

En php hay muchos metodos para esto pero kiero controlar la situaciòn antes de llegar al escript en php.

Hay les dejo la duda.
El aguinaldo es un invento comunista; pero eso no te molesta, ¿Verdad?

uDocProject

  • Visitante
envio de archivos y javascript
« Respuesta #1 : junio 18, 2006, 12:59:59 pm »
El Javascript estándar no tiene ninguna forma de comprobar la clase de archivos manejados.

Este lenguaje del navegador no tiene funciones que le permitan abrir archivos ni leer los mismos en formato binario de modo que se puede leer el contenido del archivo para correr un progrma que permita determinar su contenido.

Tampoco posee funciones que permitan saber si un archivo es EXE, JPG, BMP, etc.

Lo mejor que se puede hacer es leer la extensión del archivo (como en C:\imagen.bmp) para luego validarla en el lado servidor con las funciones de PHP (o funciones personalizadas) para ver si la extensión y el tipo de archivo encajan.

----------------

En Mozilla están proponiendo funciones de manejo de archivos al estilo C; aunque aparentemente en la actualidad no se implementan formalmente:

-------------
http://www.mozilla.org/js/js-file-object.html

-------------

Sin embargo, parece que aun siendo así, estas funciones de Javascript son para el lado servidor, y jamás para el lado cliente (por razones de seguridad).

--------------
http://www.google.com.sv/search?q=%22javascript%22+%22file+object%22

--------------


Sin embargo, Internet Explorer puede abrir archivos usando Javascript:

Código: [Seleccionar]
<script language="JavaScript">
  var fileHandle = new ActiveXObject("Scripting.FileSystemObject");
  myfile         = fileHandle.GetFile("C:\\BOOTLOG.txt");
</script>

------------
------------

Es dudoso que esta clase de elementos ActiveX funcionen universalmente, especialmente hablando de plataformas UNIX.


Para Firefox:

-----------
http://kb.mozillazine.org/File_IO

-----------
« Última Modificación: junio 18, 2006, 01:03:30 pm por uDocProject »

Desconectado kerberoz

  • The Communiter-
  • *
  • Mensajes: 3713
Re: envio de archivos y javascript
« Respuesta #2 : junio 18, 2006, 01:15:15 pm »
 :shockd: :shockd: Entonces mejor lo hago con php.
El aguinaldo es un invento comunista; pero eso no te molesta, ¿Verdad?

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: envio de archivos y javascript
« Respuesta #3 : junio 18, 2006, 01:18:22 pm »
:shockd: :shockd: Entonces mejor lo hago con php.

Tranquilo kerberoz... hahaha

Esta vez uDoc creo que no se ha documentado bien.

En realidad si se puede obtener el valor del campo file.

Para prueba un botón, este script pequeño te demuestra como:

Código: [Seleccionar]
<html>
<head>
<SCRIPT language="JavaScript">
<!--hide

function check()
{
formulario.output.value = formulario.test.value;
}
//-->
</SCRIPT>
</head>
<body>
<a href="#" onclick="javascript:check();">clickMe</a>
<form name="formulario">
<input type="file" name="test">
<input type="text" name="output">
</form>
</body>
</html>


Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: envio de archivos y javascript
« Respuesta #4 : junio 18, 2006, 01:27:38 pm »
Es más... aquí te va un pequeño script, que te indica cuando el archivo que has subido no es gif.

Se hace usando javascript y expresiones regulares:

Código: [Seleccionar]
<html>
<head>
<SCRIPT language="JavaScript">
<!--hide

function check()
{
    if (formulario.test.value.match(/^.*\.gif$/)) {
// Si el tipo de archivo termina en .gif
// Se cambia el valor del formulario
        formulario.output.value = formulario.test.value;
        // Aquí puedes implementar una funcion
        // de envio de los datos
        // formulario.submit();
    } else {
// Si no, entonces tira una alerta
window.alert('Tipo de archivo no valido');
    }
}
//-->
</SCRIPT>
</head>
<body>
<a href="#" onclick="javascript:check();">clickMe</a>
<form name="formulario">
<input type="file" name="test">
<input type="text" name="output">
</form>
</body>
</html>


Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: envio de archivos y javascript
« Respuesta #5 : junio 18, 2006, 01:32:20 pm »
Solo por seguridad has un segundo chequeo en el servidor.

Con PHP podes limitar el tamaño de archivo máximo a subir, para que de esa manera cancele la conexion al ser demasiado grande.


Desconectado kerberoz

  • The Communiter-
  • *
  • Mensajes: 3713
Re: envio de archivos y javascript
« Respuesta #6 : junio 18, 2006, 01:39:47 pm »
Excelente, eso resuelve el problema del tipo de archivo  :thumbsup:. Pero, ¿y con el tamaño del fichero que onda?
El aguinaldo es un invento comunista; pero eso no te molesta, ¿Verdad?

Desconectado morph

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5092
  • Un saludo para mi club de fans!
Re: envio de archivos y javascript
« Respuesta #7 : junio 18, 2006, 01:45:21 pm »
Excelente, eso resuelve el problema del tipo de archivo  :thumbsup:. Pero, ¿y con el tamaño del fichero que onda?

Con el tamaño del fichero eso si lo tenes que hacer con PHP.



My mail: morph[at]svcommunity.org || Linux Certificate No. 426111

uDocProject

  • Visitante
envio de archivos y javascript
« Respuesta #8 : junio 18, 2006, 01:55:09 pm »
Pero ese método solamente comprueba la extensión del archivo, no la cabecera del mismo ni el contenido.

Si un archivo de texto (TXT) se renombrara a GIF se consideraría que es un archivo GIF en el lado de Javascript (el cliente).

El tamaño de archivo podría verse usando los métodos de Javascript que ya sea para Internet Explorer o Firefox.

El tamaño del archivo puede limitarse no solo con PHP sino que con los parámetros del servidor como:


* Tiempo de espera para mantener la conexión. Si un archivo es muy grande y requiere unos 15 minutos para ser subido, podemos configurar el servidor (Apache) para que solo espere hasta un máximo de 5 minutos.

* Cantidad de memoria para los scripts de PHP.


Esto también puede servir como método de seguridad si solo se desea permitir subir archivos relativamente pequeños.

Se puede configurar PHP (lado servidor) para limitar el uso de recursos y de tiempo:


Código: [Seleccionar]
; Tiempo de ejecución máximo en segundos para
; cada script de PHP:
  max_execution_time=60

;Tiempo máximo en segundos que cada script
;de PHP puede emplear interpretando datos
;de petición:
  max_input_time=60


;Cantidad máxima de memoria en megabytes
;que un script de PHP puede consumir:
  memory_limit=8M


Se encuentra usualmente en PHP.ini en el directorio de instalación de PHP.


-------------------
-------------------
-------------------
-------------------

Sin embargo, es mejor comprobar la validez del archivo exclusivamente en el lado servidor para obtener una interfaz portable.
« Última Modificación: junio 18, 2006, 03:53:13 pm por uDocProject »

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: envio de archivos y javascript
« Respuesta #9 : junio 18, 2006, 02:03:31 pm »
Si uDocProject.. pero la idea de la comprobación de javascript es poder determinar de una manera rápida y del lado del cliente si la extensión del archivo es válida.

Obvio que podes meter un txt como gif, y eso no hay forma de evitarlo.

Siempre siempre, se hace la comprobación en ambos lados, por eso dije que por seguridad se comprueba en el servidor.

Ahora, con el tamaño de archivo si no se puede hacer nada. Porque ahi si no hay funcion que permita hacerlo.

Otra forma, seria hacer un flash que se encargue de subir el archivo, flash si posee funciones para determinar tamaño de archivos y tipo, sin problemas.


Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: envio de archivos y javascript
« Respuesta #10 : junio 18, 2006, 02:49:41 pm »
kerberoz , si se puede hacer las dos cosas en el formulario , controlar el tipo de archivo y el tamaño , pero lo mejor que tenes que hacer es validarlo con el php y si no cumple simplemente no subas el archivo y explicale al usuario el error, si fue de tipo de tamaño o si fue de extension del archivo, te digo esto porque el usuario facilmente puede alterar el codigo javascript en su maquina (localmente) guardando una copia del formulario y enviarte datos incorrectos , como quien dice si lo haces por javascript siempre lo tenes que hacer por php, para que hacer el doble trabajo ? lo mas seguro es que lo valides con el php.

Pero por si igual lo queres hacer , pues segui los consejos de mxgxw para validar la extension del archivo, y para validar el tamaño en el formulario se ocupa un input type como este, ojo que tiene que ir antes del input type del archivo (file)

Código: [Seleccionar]
<input name="MAX_FILE_SIZE" value="6246976" type="hidden">
ese por ejemplo te permite archivos de mas o menos 6mb

Se puede configurar PHP (lado servidor) para que limitar uso de recursos y de tiempo:


Código: [Seleccionar]
; Tiempo de ejecución máximo en segundos para
; cada script de PHP:
  max_execution_time=60

;Tiempo máximo en segundos que cada script
;de PHP puede emplear interpretando datos
;de petición:
  max_input_time=60


;Cantidad máxima de memoria en megabytes
;que un script de PHP puede consumir:
  memory_limit=8M


Se encuentra usualmente en PHP.ini en el directorio de instalación de PHP.

estas variables no tienen nada que ver con el envio de archivo , las que lo controlan es el post limit algo asi y el max file size .



« Última Modificación: junio 18, 2006, 03:18:26 pm por rdoggsv »

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: envio de archivos y javascript
« Respuesta #11 : junio 18, 2006, 03:02:27 pm »
El tamaño del archivo puede limitarse no solo con PHP sino que con los parámetros del servidor como:

* Tiempo de espera para mantener la conexión. Si un archivo es muy grande y requiere unos 15 minutos para ser subido, podemos configurar el servidor (Apache) para que solo espere hasta un máximo de 5 minutos.

* Cantidad de memoria para los scripts de PHP.

Esto también puede servir como método de seguridad si solo se desea permitir subir archivos relativamente pequeños.

Tal vez eso sea del interés en este tema. Al menos eso me servirá para admitir subidas al servidor que no rebasen un límite prudencial de recursos. Veré si incluyo esos detalles aquí de forma más ordenada.

Esto si creo que esta totalmente errado, alterar el php.ini para lo que vos decis, en un mismo servidor se pueden tener diferentes formularios unos que permitan un tamaño de arhivos , y otro formulario para alguna otra funcionalidad que permita otro tamaño de archivos, si vos limitas en el php.ini esta situacion estas convirtiendolo en un problema para cuando vas a querer permitir archivos mas grandes.

En el php.ini lo mas recomendable es dejarle un tamaño considablemente grande inclusive mas grande de los 2M que vienen por default, y luego en cada script validar el tamaño de los archivos que estas manejando.

uDocProject

  • Visitante
envio de archivos y javascript
« Respuesta #12 : junio 18, 2006, 04:08:38 pm »
El punto es que esos parámetros de PHP.ini pueden tomarse como las capacidades máximas admitidas por un programa de PHP, ya sea para manejar archivos u otras cosas.

Ciertamente para cada formulario se puede controlar los parámetros específicos admitidos.

La intención de cambiar esos parámetros es limitar la cantidad de recursos a usar. De esa forma, en el más intenso de los casos no se esperará 1 hora subiendo un archivo enorme cuando lo que deseábamos permitir era un archivo mucho menor, con un tiempo de subida también menor.

Por ejemplo, si configuramos PHP para esperar hasta 60 segundos pero un archivo requiere como mínimo 15 minutos para transferirse, jamás terminará dicha transferencia y de esa forma controlamos indirectamente el tamaño del archivo (se cortará la conexión).

Código: [Seleccionar]
;Tamaño máximo permitido para
;archivos a subir:
  upload_max_filesize=8M


;Tamaño máximo de datos POST
;que PHP aceptará:
  post_max_size=8M


Estos mensajes no han estado pensados para ser referencias completas, y por esa razón es necesario que las partes interesadas investiguen por su cuenta el resto de parámetros a utilizar y a continuar haciendo preguntas si se requiere.

Desconectado kerberoz

  • The Communiter-
  • *
  • Mensajes: 3713
Re: envio de archivos y javascript
« Respuesta #13 : junio 18, 2006, 05:03:33 pm »
Ok ya lo hice como me explico mxgxw y kedo excelente, al menos cosmeticamente le puedo avisar al usuario del error antes de llegar a la validacion con php, de todas formas lo voy ha validar con php.

Ahora rddogsv, con lo de MAX_FILE_SIZE ya capte la idea; pero de donde obtengo el tamaño del archivo que desea subir el usuario, hay alguna funcion para esto?. MAX_FILE_SIZE es un campo que el programador coloca y le asigna un valor pero como obtengo el tamaño del archivo que va ha subir el usuario.
El aguinaldo es un invento comunista; pero eso no te molesta, ¿Verdad?

uDocProject

  • Visitante
Re: envio de archivos y javascript
« Respuesta #14 : junio 18, 2006, 05:26:26 pm »
Todos las variables de lado servidor que se han expuesto hasta ahora tienen efecto hasta que se ha subido el archivo o se han rebasado los límites que indican (a excepción de las variables de tiempo, que terminan la conexión en tiempo real, cuando la transferencia se excede).

Una vez subido el archivo y tomando en cuenta todos los detalles de que se ha hablado, este debería ser válido (en lo que respecta a tamaño).

Para asegurarse de esto se puede guardar una copia temporal de dicho archivo y utilizar la función de PHP  -- filesize("archivo.ext")  --. Si es un archivo de tamaño válido entonces se guarda; de lo contrario se borrará (o lo necesario).