2010-01-21 39 views
5

Tôi hiện đang làm việc trên một tập tin tải lên tập tin AJAX, mà hoạt động như một nét duyên dáng trong Firefox nhưng không hoạt động trong IE.Hỗ trợ crossload Ajax jQuery AJAX Fileupload

đây là HTML cơ bản tôi đang sử dụng:

<form > 
    <input type="file" name="FileFields" id="FileFields"/> 
    <button type="button" onclick="uploadFile();" id="uploadButton">Upload</button> 
    <ul id="files"/> 
    ... other form elements ... 
</form> 

<div id="fileUploadDiv"/> 

này là chức năng UploadFile:

function uploadFile() 
{ 
    //we don't want more then 5 files uploaded 
    if($('#files li').size() >= 5) 
    { 
     return; 
    } 
    //disable the upload button 
    $('#uploadButton').attr('disabled','disabled'); 
    //show loading animation 
    $('#files').append(
     $('<li>') 
      .attr('id','loading') 
      .append(
       $('<img>').attr('src','/images/loading.gif') 
      ) 
      .addClass('loading') 
    ); 

    //add all neccessary elements (the form and the iframe) 
    $('#fileUploadDiv').append(
     $('<form action="/uploadFile" method="post" id="fileUploadForm">') 
      .attr('enctype','multipart/form-data') 
      .attr('encoding', 'multipart/form-data') 
      .attr('target', 'upload_frame') 
      .append(
       $('#FileFields').clone() 
        .css('visibility','hidden') 
     ) 
     .append(
      $('<iframe>').attr('name','upload_frame') 
       .load(function(){finishedPostingFile();}) 
       .attr('id','upload_frame') 
       .attr('src','') 
       .css({ 
        'width':'0px', 
        'height':'0px', 
        'border':'0px none #fff' 
       }) 

     ) 
    ); 


    //start uploading the file 
    $('#fileUploadForm').submit(); 
} 

và finishedPostingFile() sẽ được gọi trở lại chức năng khi iframe đã hoàn tất gửi bài /tải.

Bây giờ, tính năng này hoạt động như một nét duyên dáng trong Firefox nhưng không hoạt động trong IE. Tôi đã tìm ra rằng IE cần attr('encoding',...) thay vì attr('enctype',...) và tôi cũng đã thử nó mà không cần tạo biểu mẫu và khung nội tuyến khi đang di chuyển bằng cách viết các phần tử đó dưới dạng html thuần túy, điều này thực sự không tạo ra sự khác biệt.

IE (IE8, được bê tông, chưa thử nghiệm trong < 8) không đưa ra lỗi và hoạt ảnh tải chỉ tiếp tục quay mà không có tệp nào được tải lên ... Bất kỳ ai cũng có ý tưởng về cách thực hiện công việc này?

+0

Bạn đã bao giờ nhận được câu trả lời hay về điều này chưa? – camainc

Trả lời

4

Tại sao không sử dụng điều này, http://valums.com/ajax-upload/?

Hoặc ít nhất hãy xem mã của họ để xem đúng cách để tạo Biểu mẫu sẽ hoạt động trên trình duyệt chéo.

+0

rằng tập lệnh đó dường như không cho phép bạn sử dụng '' thông thường kết hợp với một nút riêng biệt để gửi dữ liệu, thay vào đó dường như chỉ cho phép gửi bằng cách sử dụng 'input'that tạo ra trên bay, mà không phải là những gì tôi muốn. Chủ yếu là vì lý do tương thích nếu người dùng đã tắt javascript. Nhưng tôi sẽ kiểm tra nguồn để xem cách họ làm điều đó, có thể tha sẽ dẫn tôi đi đúng hướng :) – Zenon

+0

Cho đến nay, điều này tốt hơn nhiều so với bản tải xuống lỗi đã khiến tôi phát điên trong vài ngày này - hộp vô hình được tạo ra khỏi vị trí –

+1

Liên kết ở trên dường như đã chết. Tôi đoán điều này là chính xác: https://github.com/Valums-File-Uploader/file-uploader –

0

đây là ví dụ làm việc cho Firefox/IE7/IE8, tôi hiện đang sử dụng hộp thoại jqueryUI cho thanh tiến trình.

chỉ thay thế "DocumentUploadForm" với Id của mẫu của bạn

$(document).ready(function() { 
    $("#DocumentUploadForm").submit(function(data) { 
     data.preventDefault; 

     var submittingForm = $("#DocumentUploadForm"); 
     var frameName = ("Upload"); 
     var uploadFrame = $("<iframe name=\"" + frameName + "\" />"); 

     uploadFrame.css("display", "none"); 


     $(".document_upload_progress").dialog({ 
      autoOpen: true, 
      bgiframe: true, 
      resizable: false, 
      height: 150, 
      width: 350, 
      modal: true, 
      overlay: { 
       backgroundColor: '#000', 
       opacity: 0.5 
      }, 
      open: function() { 
       $(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").remove(); 
      }, 
      close: function() { 
       $(".document_upload_progress").dialog("destroy"); 
      } 
     }); 


     uploadFrame.load(function(data) { 
      //submit complete 
      setTimeout(function() { uploadFrame.remove(); }, 100); 
      $('#document_upload_dialog').dialog('close'); 
     }); 

     $("body:first").append(uploadFrame); 

     //setup complete 
     submittingForm.attr("target", frameName); 
    }); 
}); 

hth

+1

tôi cần một biểu mẫu riêng để gửi các tệp, với đầu vào tệp gốc ở dạng đầu tiên, cùng với mọi thứ khác, cộng với một hình thức thứ hai bên ngoài mà không phải là công cụ tải lên ajax. Tôi đã thử sử dụng toàn bộ hàm .submit (.....) mà bạn đã cung cấp với biểu mẫu đó nhưng nó vẫn không hoạt động trong IE8. – Zenon

0

Tôi đoán khung hình của bạn không bao giờ bị gắn vào DOM trong IE. Atleast nếu HTML bạn đã đăng hoàn tất. Vì nó không chứa bất kỳ div nào có id = fileUploadDiv

Bạn có thể xác nhận điều này bằng cách thêm iframe có chiều rộng và chiều cao khác 0 và đặt src thành URL chính xác.

+0

cảm ơn vì đã chỉ ra điều đó, tôi đã điều chỉnh nó để kết hợp div. Tôi bằng cách nào đó quên tất cả về điều đó sau khi thử những thứ khác nhau trong 3 giờ qua. – Zenon

+0

Ngoài ra, bạn đang thêm iframe vào biểu mẫu. Nó không cảm thấy điều đúng đắn để làm. Hãy thử thêm iframe trực tiếp vào –

+0

Tôi đang thêm biểu mẫu vào div bên ngoài biểu mẫu, nhưng tôi sẽ thử nó với phần thân – Zenon

0

Cảm ơn mọi người.

Tôi hiện sử dụng tập lệnh từ http://www.uploadify.com.

lớn kịch bản với rất nhiều chức năng tùy biến ...

3

tôi đã làm thay đổi này tại dòng 10:

và nó làm việc

if(window.ActiveXObject) { 
       var io; 


       try 
       { 
        //Your JavaScript code will be here, routine JavaScript statements area. 
        io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />'); 
       } 
       catch(err) 
       { 
        //JavaScript Errors handling code will be here 
        io=document.createElement("iframe"); 
        io.setAttribute("id",frameId); 
        io.setAttribute("name",frameId); 
       } 
0

Tôi đang làm một điều rất giống nhau, tôi đã có vấn đề mà chỉ cần IE8 đã không tải lên các tập tin vào máy chủ của tôi; có một IniSizeError.

Giải pháp của tôi đã được bổ sung thêm dòng này:

form.encoding = "multipart/form-data"; 

mẫu của tôi khi tạo ra. Thuộc tính loại mã cũng được yêu cầu.