Pregunta

Sé que este tipo de preguntas existe en SF pero son muy específicos, necesito una sugerencia genérica. Necesito una función para subir archivos de usuario que podrían ser de tamaño mayor que 1 GB. Esta característica será un complemento a la ya existente de carga de archivos característica presente en la aplicación que abastece a los archivos más pequeños. Ahora, aquí están algunas de las opciones

  1. Usar HTTP y el applet de Java. Enviar los archivos en trozos y unirse a ellos en el servidor. Pero cómo limitar el n / w.
  2. Usar HTTP y la aplicación Flex. ¿Es mejor que un applet compatibilidad del navegador WRT y cualesquiera otras cuestiones del medio ambiente?
  3. Uso de FTP o SFTP en lugar en lugar de HTTP como protocolo para proceso de carga más rápido

Para sugerir.

Por otra parte, no tengo para asegurarse de que este proceso de carga no obstaculizan la tarea de otros usuarios o, en otras palabras, no comer hasta b de otros usuarios / w. Cualquier mecanismo que se pueden hacer en n / nivel w para estrangular tales procesos?

En última instancia al cliente quería tener FTP como una opción. Sin embargo, creo que la respuesta con el manejo de archivos de programación también es fresco.

¿Fue útil?

Solución

Para enviar archivos a un servidor, a menos que Tienes para utilizar HTTP, FTP es el camino a seguir. Estrangulación, no estoy completamente seguro de, al menos no mediante programación.

En lo personal, parece que las limitaciones de la velocidad de subida sería mejor consumado en el lado del servidor sin embargo.

Otros consejos

Usar cualquier lenguaje del lado del cliente que desea (una aplicación Java, Flex, etc.), y empujar al servidor con HTTP PUT (sin Flex) o POST. En el código de Java del lado del servidor, regular el flujo de bytes en su bucle de flujo de entrada. Un crudo, simple, fragmento muestra que limita el ancho de banda a no más rápido que un promedio <= 10 KB / segundo:

InputStream is = request.getInputStream();
OutputStream os =  new FileOutputStream(new File("myfile.bin"));
int bytesRead = 0;
byte[] payload = new byte[10240];

while (bytesRead >= 0) {
    bytesRead = is.read(payload);

    if (bytesRead > 0) 
        os.write(payload, 0, bytesRead);

    Thread.currentThread().sleep(1000);
}

(Con mayor complejidad se podría regular con mayor precisión el ancho de banda de flujo único, pero se vuelve compleja cuando se considera buffers de los conectores y tal. "Lo suficientemente bueno" es suficiente por lo general buena.)

Mi aplicación hace algo similar a la anterior - regulamos tanto hacia arriba (POST y PUT) y (GET) por el ancho de banda flujo. Aceptamos archivos en los 100s de MB cada día y hemos probado hasta 2 GB. (Más allá de 2GB hay los problemas primitivos int de Java molestos que tratar.) Nuestros clientes son tanto Flex y curl. Funciona para mí, puede funcionar para usted.

Mientras que FTP es grande y todo, puede evitar muchos (pero no todos) los problemas de firewall usando HTTP.

Si desea reducir el ancho de banda es posible que desee enviar los datos comprimidos (a menos que ya se comprime) Esto puede salvar a 2-3 veces el volumen de datos en función de lo que está enviando.

Para un ejemplo de buena práctica para subir archivos de gran tamaño, y las diversas formas de abordarlo, echar un vistazo a flickr.com (puede que tenga que registrarse para acceder a la página de subida)

Ofrecen diversas opciones, incluyendo la forma de HTTP de subida, un cliente de escritorio de Java, o algún tipo de aparato Javascript impulsado que no acabo de entender. No parecen utilizar el flash en cualquier lugar.

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