2011-02-28 12 views
7

Tengo un formulario HTML con un elemento de carga de archivos, que se basa en Uploadify. Desafortunadamente, si el navegador no tiene flash instalado/habilitado (probé en Chrome y Safari), entonces el elemento de carga de archivos es completamente desapareciendo, mientras que yo esperaba tener al menos un archivo plano, normal y cargar html elemento como una reserva.Uploadify arruina la carga del archivo cuando no hay flash en el navegador

Puede ver este comportamiento incluso en demo oficial Uploadify (a partir de hoy, 28.2.2011):

http://www.uploadify.com/demos/

Cualquier persona encontró su forma de evitar esto? Saludos


ninguno de estos funciona en la situación de que el flash está instalado, pero no está habilitado!
por ejemplo, esta línea:

if (swfobject.getFlashPlayerVersion().major === 0) 

comporta de la misma Flash clima está instalado y activado, o instalado y habilitado!
Pensé en obtener la API de uploadify y verificarla, pero he encontrado cero ejemplos, ¿alguna idea?

+2

Pregunta interesante. La "degradación agraciada" no está en la lista de características de Uploadify, así que puede que no haya forma de hacerlo (aparte de comprobar Flash y mostrar una entrada normal) –

+0

Para actualizar esta pregunta: A partir de la primavera de 2012, ahora hay un HTML5 comercial versión de Uploadify: Uploadifive. Estoy cargando Uploadifive en body onload() y ocultando la versión flash, luego, si el texto en el botón de carga no cambia, configuro style: "display: none;" a la versión HTML5 y cambiar a la versión flash. –

+0

, de nuevo, sería el problema en IE sin compatibilidad con html5 ... – zaw

Respuesta

1

Me sorprende que Uploadify no se degrade elegantemente, parece ser un requisito clave. Si no quiere trabajar por su cuenta, puede usar una biblioteca que proporcione una alternativa cuando Flash no esté presente.

http://swfupload.org/

SWFUpload es una pequeña biblioteca Javascript/Flash para obtener lo mejor de ambos mundos. Cuenta con la gran capacidad de carga de Flash y la accesibilidad y facilidad de HTML/CSS.

  • cargar varios archivos a la vez ctrl/shift-selección en el diálogo
  • devoluciones de llamada de JavaScript en todos los eventos
  • Obtener información de archivo antes de subida comienza
  • elementos de estilo de carga con XHTML y CSS
  • de visualización información mientras se cargan los archivos con HTML
  • No se necesita recargar la página
  • Funciona en todas las plataformas/navegadores que tienen Fla sh apoyo.
  • degrada con gracia a la forma normal de subida HTML si Flash o Javascript no está disponible
  • tamaño del archivo de control antes de que comience carga
  • Sólo mostrar tipos de archivos seleccionados en el diálogo
  • archivos de cola, quitar/añadir archivos antes de iniciar la carga
+1

agraciado de la degradación no parece implementada en las demostraciones para swfupload ... – Fergie

+0

+1 lo que dijo Fergie.La falta de soporte sin flash es lo que me llevó aquí en busca de una mejor solución :) – nathanchere

+0

Estamos utilizando el módulo swfupload para Drupal aquí y definitivamente no se degrada a HTML con Flash deshabilitado o no presente. – pthurmond

1

También he estado muy contento con plupload (http://www.plupload.com/). Admite HTML 5, Flash, Silverlight, Google gears y HTML 4.

0

Tuve el mismo problema y lo solucioné utilizando Javascript Flash Detection Library.Es un archivo de script pequeño que le permite verificar la versión de Flash Player actualmente instalada.

2

Creo que jQuery File Upload es una gran solución para eso.

Características:

  1. Carga de archivos múltiples
  2. Arrastre & gota apoyo
  3. Subir la barra de progreso
  4. subidas cancelable
  5. cargas reanudables
  6. archivos fragmentados
  7. Vista previa de imágenes
  8. Sin complementos del navegador (p. Adobe Flash) requiere
  9. repliegue agraciado por navegadores antiguos
  10. subidas
  11. HTML forma de carga de archivos de respaldo
  12. entre sitios de envío de archivos
  13. instancias de plugin múltiples
  14. contenidos personalizables y extensibles
  15. multiparte y archivo de flujo
  16. Compatible con cualquier plataforma de aplicación del lado del servidor
2

Así es como resolví este problema. He añadido a mi código:

<!--Flash Fallback--> 
<div> 
    <object type="application/x-shockwave-flash" width="0" height="0"> 
    <a href="http://www.adobe.com/go/getflashplayer" target="_blank"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a> 
    </object> 
</div> 

Entonces posicionados absolutamente sobre el botón uploadify por lo que el 'Get Flash Player' se muestra el botón en lugar del botón uploadify si el navegador tiene instalado sin flash.

Una vez instalado el reproductor de flash, el 'Obtener Flash Player' botón desaparece ahora que el objeto tiene anchura y la altura ajustado a 0.

+0

He hecho este código, pero en ie-9 no funciona? –

+0

, pero ¿puede manejar el escenario flash instalado + deshabilitado correctamente? –

3

utilizo el onSWFReady caso, que no se activa si el flash está desactivado, por supuesto. Me quito el bloque que contiene la entrada de archivo nativo y mostrar el div uploadify si se carga SWF, funciona como un encanto:

onSWFReady: function() { 
    $('#property-post .upload .browse').remove(); 
    $('#uploadify').css('display', 'block'); 
} 
0

Por qué no puedes hacer lo siguiente (siempre que tenga swfobject)?

if(swfobject.getFlashPlayerVersion().major > 0) 
    //uploadify code here... 
} 

Si se detecta flash, se ejecuta el script de carga. De lo contrario, se degrada graciosamente a la entrada estándar del archivo del navegador.

He probado esto en Chrome/FireFox/Safari/IE7/IE8 y funciona muy bien.

3

Si está utilizando la versión más reciente de uploadify puede utilizar el evento onFallback para detectar si se ha instalado el flash (o si es compatible con la versión de flash necesaria del flash):

$("#file_upload").uploadify({ 
    'swf'  : '/uploadify/uploadify.swf', 
    'uploader' : '/uploadify/uploadify.php', 
    'onFallback' : function() { 
     alert('Flash was not detected or flash version is not supported.'); 
    } 
}); 
+1

, pero ¿puede manejar el escenario instalado + deshabilitado correctamente? –

+0

Accordin a la respuesta de @ Liam, sí ... – giovannipds

1

Mi solución funciona en IE6 , IE9, Firefox, Chrome y Safari, con Flash habilitado, deshabilitado o no instalado.

que empezar con una forma básica de carga de archivos HTML:

<input id='f_file' name='f_file' type='file' /> 
<input id='f_submit' name='f_submit' type='submit' value='Upload' /> 

El evento onFallback se dispara cuando la versión de Flash requerido no está instalado o está deshabilitado. Si esto sucede, "destruyo" la instancia de carga, que la restablece al formato HTML básico.

'onFallback' : function() { 
    $("#f_file").uploadify("destroy"); 
} 
0

Esto funciona sin Flash instalado y Flash instalado pero deshabilitado. Solo lo he confirmado en IE7-9 y FF19 pero debería funcionar en cualquier navegador que pueda usar la versión de Uploadify SWF.

En el html tienen 2 divs. Uno sin Flash y para con Flash

<div id="uploadifyDiv" runat="server" style="float: left; width: 100%; margin-top: 10px;"> 
    <div id="uploadifyNoFlashDiv"> 
    <p style="font-weight:bold; background-color:Red; color:Black;">Flash is not installed or is not enabled</p>  
    File upload requires Flash to be installed and enabled.<br /> 
    Click <a href="http://get2.adobe.com/flashplayer/" target="_blank">here</a> to install<br /> 
    You will need to <a href="javascript:window.location.href=window.location.href">refresh</a> the page when installation is completed</p> 
    </div> 
    <div id="uploadifyHasFlashDiv" style="display:none;"> 
    <asp:FileUpload ID="ImageFileUpload" runat="server" /> 
    </div> 
</div> 

En el guión Uploadify incluyen una función para onInit

onInit : function(instance) { 
    $('[id$="uploadifyNoFlashDiv"]').css('display','none'); 
    $('[id$="uploadifyHasFlashDiv"]').css('display','block');}, 

Si Flash no instalado o instalado pero no activado, a continuación, se mostrará el div uploadifyNoFlashDiv , de lo contrario, OnInit ocultará el elemento uploadifyNoFlashDiv div y mostrará el elemento uploadifyHasFlashDiv div que, asumiendo que todo lo demás está bien, generará el control Uploadify.

Por supuesto, esto no proporciona ninguna funcionalidad si el usuario no instalar Flash pero sí al menos
- Ver el mensaje correspondiente asesoramiento que necesitan para instalar Flash (o activarlo si ya está instalado)
- Ocultar el FileUpload genérico que aparece si falla el script Uploadify

IMHO Uploadify sigue siendo superior a los otros cargadores mencionados como alternativas, ya que es el único que proporciona selección de archivos múltiples en navegadores que no son HTML5, que lamentablemente incluye IE9 en Win7. Todos los demás cargadores solo permiten seleccionar un solo archivo en el cuadro de diálogo del archivo.

EDITAR: En conexiones lentas, el div instalado No Flash se mostrará antes de que el script Uploadify tenga la oportunidad de ejecutarse, lo cual es confuso para el usuario si tiene Flash instalado y el div finalmente se ocultará. En este escenario, agregue otro div con un gif de carga y luego ejecute un script en la carga del documento para mostrar el div apropiado.

<div id="uploadifyDiv" runat="server" style="float: left; width: 100%; margin-top: 10px;"> 
    <div id="uploadifyNoFlashDiv" runat="server" class="infoBoxDiv" style="display: block;"> 
     <div id="uploadifyNoFlashLoadingDiv" style="display:block"> 
      <img src="../images/uploading.gif" alt="Loading ..." /> Loading. Please wait a moment ... 
     </div> 
     <div id="uploadifyNoFlashFinalDiv" style="display:none;"> 
      <p style="font-weight: bold; background-color: Red; color: Black;"> 
       Flash is not installed or is not enabled</p> 
      <p> 
       File upload requires Flash to be installed and enabled.<br /> 
       Click <a href="http://get2.adobe.com/flashplayer/" target="_blank">here</a> to install<br /> 
       You will need to <a href="javascript:window.location.href=window.location.href">refresh</a> 
       the page when installation is completed 
      </p> 
     </div> 
    </div> 
    <div id="uploadifyHasFlashDiv" runat="server" style="display: none;"> 
     <asp:FileUpload ID="ImageFileUpload" runat="server" /> 
    </div> 
</div> 

<script language="javascript" type="text/javascript"> 
    // If the NoFlashDiv is still visible then hide the loading gif and show the info box 
    // Otherwise leave alone and the Uploadify script will do its thing 
    $(document).ready(function() { 
     if ($('[id$="uploadifyNoFlashDiv"]').css('display') == 'block') 
     { 
      $('[id$="uploadifyNoFlashLoadingDiv"]').css('display','none'); 
      $('[id$="uploadifyNoFlashFinalDiv"]').css('display','block'); 
     }     
    }); 
</script> 
Cuestiones relacionadas