2008-08-29 36 views
43

Tôi đã sử dụng plugin Biểu mẫu jQuery để gửi biểu mẫu không đồng bộ. Đối với các biểu mẫu có chứa tệp, nó sao chép biểu mẫu vào một iframe ẩn, gửi nó và sao chép lại nội dung của iframe. Vấn đề là tôi không thể tìm ra cách để tìm mã trạng thái HTTP nào được máy chủ trả về. Ví dụ: nếu máy chủ trả về 404, dữ liệu từ khung nội tuyến sẽ được sao chép như bình thường và được coi là phản hồi thông thường.Lấy mã trạng thái HTTP từ khung nội tuyến đã tải bằng Javascript

Tôi đã thử poking xung quanh trong các đối tượng iframe tìm kiếm một số loại thuộc tính status_code, nhưng không thể tìm thấy bất cứ điều gì như thế.


Không thể sử dụng chức năng $.ajax() vì không hỗ trợ tải lên tệp. Cách duy nhất để tải lên tệp không đồng bộ mà tôi biết là sử dụng phương thức iframe ẩn.

+1

tại sao không chạy một số js trên iframe kết quả? ý tôi là, bạn có thể đặt thời gian chờ tải trang (trên trang gốc) và con (khung nội tuyến) sẽ đặt giá trị ở cấp độ gốc. nếu giá trị đó không được đặt cho đến khi hết thời gian chờ, iframe không thành công. – Dementic

Trả lời

17

Bạn không thể có được tiêu đề trang của JS, nhưng bạn có thể phân biệt lỗi từ thành công: Hãy thử một cái gì đó như thế này:

<script type="text/javascript"> 

    var uploadStarted = false; 
    function OnUploadStart(){    
     uploadStarted = true; 
    } 

    function OnUploadComplete(state,message){  

     if(state == 1) 
     alert("Success: "+message);  
     else 
     if(state == 0 && uploadStarted) 
      alert("Error:"+(message ? message : "unknow")); 
    } 

</script> 


<iframe id="uploader" name="uploader" onload="OnUploadComplete(0)" style="width:0px;height:0px;border:none;"></iframe> 

<form id="sender" action="/upload.php" method="post" target="uploader" enctype="multipart/form-data" onsubmit="OnUploadStart()"> 
<input type="file" name="files[upload]"/> 
<input type="submit" value="Upload"/> 
</form> 

On phía máy chủ:

/* 
    file: upload.php 
*/ 
<?php 

    // do some stuff with file  

    print '<script type="text/javascript">'; 
    if(success) 
    print 'window.parent.OnUploadComplete(1,"File uploaded!");'; 
    else 
    print 'window.parent.OnUploadComplete(0, "File too large!");'; 
    print '</script>'; 
?> 
+3

Nếu tệp quá lớn, php sẽ 500, ngăn thông báo lỗi của bạn hiển thị. – KyleWpppd

+0

đây không phải là giải pháp ... – Isaac

-1

Bạn không thể truy xuất mã trạng thái HTTP từ "iframe" được tải trực tiếp. Nhưng khi xảy ra lỗi http, máy chủ sẽ không trả lại gì cho "iframe". Vì vậy, iframe không có nội dung. bạn có thể kiểm tra phần thân khung nội tuyến, khi nội dung iframe trống, hãy sử dụng ajax có cùng url để nhận phản hồi từ máy chủ. Sau đó, bạn có thể truy xuất mã trạng thái http từ phản hồi.

+0

Rất sai. Đây chỉ là một trường hợp phổ biến, nhưng thậm chí không phải là một quy ước hay thực hành tốt. Máy chủ HTTP thường phải gửi nội dung phản hồi chứa thông báo lỗi. – Lothar

+0

Trong trường hợp sử dụng "iframe" để tải xuống tệp, nó khác với yêu cầu HTTP chung. Cụ thể, IE9 sẽ thay thế nội dung "khung nội tuyến" bằng trang lỗi cục bộ từ máy khách trừ khi trạng thái HTTP là 200. Do đó, khi bạn cố gắng lấy nội dung iframe, bạn sẽ gặp lỗi tên miền chéo. @Lothar –

Các vấn đề liên quan