2012-01-24 15 views
6

Estoy creando un sitio web para un cliente, y él quiere poder tener en una sola página, muchos botones de carga. Cuando hace clic en seleccionar archivos, uploadify carga el archivo en el servidor y luego cambia el valor del campo de entrada "Imagen" a la ruta de la imagen.Uploadify Varios botones - una página

El problema es que no puedo encontrar una manera de tener múltiples botones de carga en una página, donde cada uno individualmente llenará su propio campo "Imagen" de div. Y el cliente tendrá n cantidad de divs en la misma página.

enter image description here

Aquí está mi código JS:

$(document).ready(function() { 
    $('.file_upload').uploadify({ 
    'uploader' : 'content/plugins/category_manager/upload/js/uploadify.swf', 
    'script' : 'content/plugins/category_manager/upload/upload.php', 
    'cancelImg' : 'content/plugins/category_manager/upload/js/cancel.png', 
    'folder' : 'content/plugins/category_manager/upload/uploads', 
    'fileExt'  : '*.jpg;*.gif;*.png', 
    'fileDesc'  : 'Image Files', 
    'auto'  : true, 
    'onComplete' : function(event, ID, fileObj, response, data) { 
     $("input[name=image]").empty(this).val(fileObj.name); 
     } 
    }); 
}); 

Respuesta

19

este código:

jQuery(".file_upload").each(function() { 
    jQuery(this).uploadify({ 
     height  : 30, 
     swf   : '/uploadify/uploadify.swf', 
     uploader  : '/script/uploadify/uploadify.php', 
     width   : 120 
    }); 
}); 

funciona muy bien.

Esto también requiere que los identificadores en los elementos .file_upload sean únicos, incluso si no se usan.

+0

Esta solución funcionó muy bien para mí. Necesita más reconocimiento en esta página. Gracias. – tmutton

+0

Esta es una gran solución.Lo acorté un poco reemplazando "jQuery" por '$'. Gracias @Havanasud. –

+0

Creo que esto debería funcionar sin que cada ciclo. – sumit

2

Bueno en lugar de llamar uploadify por una clase css, es necesario llamar a uploadify para una identificación específica, de lo contrario no va a funcionar.

lo que sería necesario:

$('#upload1').uploadify({ 
$('#upload2').uploadify((

etc ....

+0

No estoy seguro de si he entendido completamente lo que quiere decir, pero el cliente tiene que ser capaz de ejecutar la instancia de carga n veces, tantas como las categorías que se crearán. Entonces no puedo hacer eso manualmente. – Manolis

+0

A continuación, cree un bucle y agréguelos de forma dinámica. Pero la identificación debe ser única. –

2

tuve este mismo problema. Creo que lo que vas a querer hacer es hacer un control de usuario para cada instancia de la carga que quieras tener en tu página. Ejemplo de mi control uploadify de trabajo:

//ascx 
<style type="text/css"> 
.hidden { display:none; } 
</style> 

<script src="/Uploadify/jquery.uploadify.v2.1.4.js" type="text/javascript"></script> 
<script src="/Uploadify/jquery.uploadify.v2.1.4.min.js" type="text/javascript"></script> 
<script src="/Uploadify/swfobject.js" type="text/javascript"></script> 
<link href="/Uploadify/uploadify.css" rel="stylesheet" type="text/css" /> 

<script type="text/javascript"> 

    $(document).ready(function() { 
     var obj = document.getElementById('<%= this.fileInput.ClientID %>'); 

     $(obj).uploadify({ 
      'uploader': '/uploadify/uploadify.swf', 
      'script': '/_handlers/Upload.ashx', 
      'cancelImg': '/uploadify/cancel.png', 
      'auto': true, 
      'multi': true, 
      'fileDesc': 'Image Files', 
      'fileExt': document.getElementById('<%= this.uTypes.ClientID %>').value, 
      'buttonText': 'Choose Images', 
      'folder': '/' + document.getElementById('<%= this.fileDest.ClientID %>').value, 
      'onAllComplete': function (event, queueID, fileObj, response, data) { 
       var btn = document.getElementById('<%= this.uploadButton.ClientID %>').click(); 
      } 
     }); 
    }); 

</script> 

<input id="fileInput" name="fileInput" type="file" runat="server" style="display:none" /> 
<input id="fileDest" name="fileDest" type="text" runat="server" style="display:none"/> 
<input id="uTypes" name="uTypes" type="text" runat="server" style="display:none"/> 

<asp:Button ID="uploadButton" runat="server" CssClass="hidden" OnClick="uploadButton_Clicked" CausesValidation="false"/> 

Este es el código detrás de la sección de control, algunos de los parámetros que se ven son pasados ​​en el exterior

//Code behind 
public partial class UploadifyUpload : System.Web.UI.UserControl 
{ 
    private string fileDestination; 
    public string FileDestination 
    { 
     get { return fileDestination; } 
     set { fileDestination = value; } 
    } 

    private string uploadTypes; 
    public string UploadTypes 
    { 
     get { return uploadTypes; } 
     set { uploadTypes = value; } 
    } 

    public event EventHandler UploadButtonClicked; 

    protected void Page_Load(object sender, EventArgs e) 
    {  
     string virtualPath = fileDestination.Replace(Request.PhysicalApplicationPath, "/"); 
     virtualPath = virtualPath.Replace('\\', '/'); 
     this.fileDest.Value = virtualPath; 
     this.uTypes.Value = uploadTypes; 
    } 

    protected void uploadButton_Clicked(object sender, EventArgs e) 
    { 
     if (this.UploadButtonClicked != null) 
     { 
      this.UploadButtonClicked(this, new EventArgs()); 
     } 
    } 
} 

creo el control de esta manera y pase algunas variables El destino del archivo y el evento de clic se manejan en el código detrás de cualquier página que esté usando el control.

<mgmtControls:UploadifyUpload ID="uploadifyUpload" runat="server" UploadTypes="*.jpg;*.png;*.gif;*.bmp;*.jpeg" /> 

this.uploadifyUpload.UploadButtonClicked += new EventHandler(UploadifyUploadClicked); 
this.uploadifyUpload.FileDestination = DocumentPath; 

Esto funciona muy bien para mí en Firefox, Chrome e IE, debería guiarlo en la dirección correcta. Es posible que desee considerar agregar una opción de carga predeterminada si el usuario no tiene flash instalado también.

Multiple buttons working

0

No estoy seguro de si las respuestas anteriores cubren elementos de carga que se agregan dinámicamente (a través de AJAX, después de que la página se haya cargado). Enfrenté este problema A continuación, durante la lectura de la función "live()" en la API de jQuery, me di cuenta que se puede hacer de esta manera:

$(document).ready(function(){ 
    $('.upload_child_photograph').live('uploadifyEvent', function(){ 
     var child_id = $(this).attr('id').replace('upload_child_photograph_', ""); 

     $('#upload_child_photograph_' + child_id).uploadify({ 
      'auto'  : false, 
      'swf'  : 'uploadify.swf', 
      'uploader' : 'uploadify.php', 
      'uploadLimit' : 10, 
      'multi': true, 
      'fileSizeLimit' : 0 
     }); 
    }); 

    $(".upload_child_photograph").trigger("uploadifyEvent"); 
}); 
Cuestiones relacionadas