2010-05-26 6 views
50

Ich versuche, Ajax-Datei hochladen. Ich habe gelesen, dass dies ohne die Verwendung von iframe nicht möglich ist.
schrieb ich:Wie man asynchronen (AJAX) File Upload mit iframe machen?

<iframe id="uploadTrg" name="uploadTrg" height="0" width="0" frameborder="0" scrolling="yes"></iframe> 
<form id="myForm" action="file-component" method="post" enctype="multipart/form-data" target="uploadTrg"> 
File: <input type="file" name="file"> 
<input type="submit" value="Submit" id="submitBtn"/> 
</form> 

und mit Jquery Form Plugin:

$('#myForm').ajaxForm({ 
    dataType: 'json', 
    success: function(data){ 
     alert(data.toSource()); 
    } 
}); 

Das Ergebnis:

die Datei erfolgreich hochgeladen und ich kann die hochgeladene Datei, sondern ein Dialog sehen erscheint:

alt text

da ich ein json Ergebnis zurückschicken die Dateinamen anzuzeigen + Größe etc ..

Meine Frage: Wie kann ich die iFrame verwenden zu können „Ajax-Datei-Upload“ zu machen.

Hinweis:

  1. Ich ziehe es keine spezielle Plugin zu verwenden Datei zu, wenn es geeignetere/einfache Lösungen ist.
  2. Ich benutze Jsp/Servlets als serverseitige Sprache .. aber ich denke, es macht keinen Sinn, welche Sprache ich verwende.

Dank

+0

In Ihrer # 1, beziehen Sie sich auf jQuery-Plugins, oder Sie mea n Flash/Silverlight? –

+1

Ich meine .. jQuery-Plugins. – Abdullah

+0

Ich entwerfe eine vereinfachte Ajax-Stil-Datei Upload-Seite ohne JavaScript zu verwenden. Ich platziere einen versteckten iFrame direkt vor dem Formular-Tag. Bitte lesen Sie das Folgende. http://ramui.com/articles/ajax-file-upload-using-iframe.html –

Antwort

94

Ich werde meine Frage beantworten, ich glaube, ich die Lösung gefunden. Dies sind die Schritte, die ich folgte das Ziel zu erreichen:

  1. Machen Sie das Attribut „Ziel“ der Form Punkt „iframe“.
  2. Verwenden Sie eine normale HTML-Anforderung (keine asynchrone/Ajax-Anforderung), um das Formular zu senden.
  3. Da der Zielframe iframe ist, wird die ganze Seite nicht aktualisiert - nur der iframe.
  4. Sobald iframe onload Ereignis passiert (erfassen Sie dieses Ereignis mit Javascript) dann tun, was Sie wollen, z. Sie können eine Anfrage senden, um die zuletzt hochgeladenen Dateiinformationen aufzulisten.

Der letzte Code sieht wie folgt aus:

<!-- Attach a file --> 

    <iframe id="uploadTrg" name="uploadTrg" height="0" width="0" frameborder="0" scrolling="yes"></iframe> 

    <form id="myForm" action="http://example.com/file-upload-service" method="post" enctype="multipart/form-data" target="uploadTrg"> 

     File: <input type="file" name="file"> 
     <input type="submit" value="Submit" id="submitBtn"/> 

    </form> 

    <div id="ajaxResultTest"></div> 

javascript:

$("iframe").load(function(){ 
    // ok , now you know that the file is uploaded , you can do what you want , for example tell the user that the file is uploaded 
    alert("The file is uploaded"); 

    // or you can has your own technique to display the uploaded file name + id ? 
    $.post('http://example.com/file-upload-service?do=getLastFile',null,function(attachment){ 

     // add the last uploaded file , so the user can see the uploaded files 
     $("#ajaxResultTest").append("<h4>" + attachment.name + ":" + attachment.id "</h4>"); 

    },'json'); 
}); 
+20

+1 für das Finden der Lösung selbst. – Anurag

+4

Das Zielattribut ist veraltet (http://www.w3schools.com/TAGS/att_form_target.asp). Ich beginne zu glauben, dass man entweder veraltetes (X) HTML oder Flash/etc. um zu erreichen, was/sollte/sehr primitive Funktionalität sein. –

+0

+1 für Ihre extrem gute Lösung. Aber die Schritte sind nicht sehr klar. Sie sollten wahrscheinlich zusätzlichen Code entfernen und nur die wichtigsten Teile erklären, die hier erklärt werden: http://ramui.com/articles/ajax-file-upload-using-iframe.html – iMatoria

4

Dieses Beispiel aus BugKiller genommen.vollständiges Arbeitsbeispiel, das Sie ein Logo hochladen und es sofort in der HTML-Seite an, nach dem der Upload Wert gelöscht wird:

html:

<form id="uploadForm" method="post" enctype="multipart/form-data" target="uploadTrg"> 
    <div id="fileUploadWrapper"><input type="file" name="file" id="fileUpload"></div> 
    <input type="submit" value="Upload" id="submitBtn"/> 
</form> 
<iframe id="uploadTrg" name="uploadTrg" height="0" width="0" frameborder="0" scrolling="no" style="display:none"></iframe> 
<img id="imgLogo" style="border-width:0px;" /> 

javascript:

$(document).ready(function() { 
    var companynumber = '12345'; //get this from the database 
    var logoUploadUrl = 'UploadHandler.aspx?logoupload=true&companynumber=' + companynumber ; 
    $("#uploadForm").attr("action", logoUploadUrl); 

    $("#uploadTrg").load(function() { 
    //upload complete 

    //only way to reset contents of file upload control is to recreate it 
    $("#fileUploadWrapper").html('<input type="file" name="file" id="fileUpload">'); 

    //reload the logo url, add ticks on the end so browser reloads it 
    var ticks = ((new Date().getTime() * 10000) + 621355968000000000); 
    var logoUrl = 'images/clients/' + companynumber + '/client.gif?' + ticks; 
    $("#imgLogo").attr('src', logoUrl); 
    }); 
}); 

Upload Handler-Code hinter (C#):

namespace MyWebApp { 
    public partial class UploadHandler : System.Web.UI.Page { 

     protected void Page_Load(object sender, EventArgs e) { 
      if (Request.Params["logoupload"] != null) { 
      string companynumber = Request.Params["companynumber"]; 
      string savePath = Server.MapPath("\\images") + "\\clients\\" + companynumber + "\\client.gif"; 
      if (File.Exists(savePath)) 
       File.Delete(savePath); 
      //save the file to the server 
      Request.Files[0].SaveAs(savePath); 

      Response.Write("OK"); 
      Response.Flush(); 
      Response.End(); 
      } 
     } 
} 
+0

Es lohnt sich, dies zu aktualisieren, da $ ("# uploadTrg"). Load (function() {bit ist jetzt veraltet). –