Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Asynchronous(AJAX) File Upload using iframe?

I'm trying to make ajax file upload . I read that it is not possible to do that without using iframe .
I wrote :

<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> 

and using jquery form plugin :

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

The Result :

the file is uploaded successfully and I can see the uploaded file , but a dialog box appears :

alt text

since I send back a json result to display the file name + size etc ..

My Question : How can I use the iFrame to be able to make " ajax file upload".

Note:

  1. I don't prefer to use special plugin to upload file , if there is more appropriate/easier solutions.
  2. I use jsp/servlets as a server-side language .. but I think it does not make sense which language I use .

Thanks

like image 377
Abdullah Avatar asked May 26 '10 00:05

Abdullah


People also ask

Can we upload file using AJAX?

File upload is not possible through AJAX. You can upload file, without refreshing page by using IFrame .

What is asynchronous file upload?

This feature allows you to upload and remove files asynchronously. When multiple files are chosen in Asynchronous upload,files will be uploaded one by one to the server. User interaction with the page will not be interrupted at the time of upload. User can also remove the file even after uploading.


1 Answers

I will answer my question , I think I found the solution. These are the steps that I followed to achieve the goal :

  1. Make the attribute "target" of the form point to " iframe " .
  2. Use a normal HTML request ( not Asynchronous/Ajax request ) to submit the form.
  3. Because the target frame is iframe , the whole page will not be refreshed - just the iframe.
  4. Once iframe onload event happens (capture that event using Javascript) then do what you want, e.g. You can send back a request to list recent uploaded file info.

The final code looks like this:

    <!-- 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'); }); 
like image 114
Abdullah Avatar answered Sep 28 '22 06:09

Abdullah