Cách đơn giản và mạnh mẽ nhất mà tôi đã làm trong quá khứ, chỉ đơn giản là nhắm mục tiêu thẻ iFrame ẩn với biểu mẫu của bạn - sau đó nó sẽ gửi trong iframe mà không cần tải lại trang.
Đó là nếu bạn không muốn sử dụng plugin, JavaScript hoặc bất kỳ hình thức "ma thuật" nào khác ngoài HTML. Tất nhiên bạn có thể kết hợp điều này với JavaScript hoặc những gì bạn có ...
<form target="iframe" action="" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<iframe name="iframe" id="iframe" style="display:none" ></iframe>
Bạn cũng có thể đọc nội dung của iframe onLoad
cho lỗi máy chủ hoặc phản hồi thành công và sau đó xuất nó cho người dùng.
Chrome, iFrames và onLoad
-note- bạn chỉ cần tiếp tục đọc nếu bạn quan tâm đến cách thiết lập trình chặn UI khi thực hiện tải lên / tải xuống
Hiện tại Chrome không kích hoạt sự kiện onLoad cho iframe khi nó được sử dụng để truyền tệp. Firefox, IE và Edge đều kích hoạt sự kiện onload để truyền tệp.
Giải pháp duy nhất mà tôi thấy hiệu quả với Chrome là sử dụng cookie.
Để làm điều đó về cơ bản khi bắt đầu tải lên / tải xuống:
- [Phía khách hàng] Bắt đầu một khoảng thời gian để tìm kiếm sự tồn tại của cookie
- [Phía máy chủ] Làm bất cứ điều gì bạn cần với dữ liệu tệp
- [Phía máy chủ] Đặt cookie cho khoảng thời gian phía máy khách
- [Phía khách hàng] Interval nhìn thấy cookie và sử dụng nó như sự kiện onLoad. Ví dụ: bạn có thể khởi động trình chặn UI và sau đó onLoad (hoặc khi cookie được tạo), bạn xóa trình chặn UI.
Sử dụng một cookie cho điều này là xấu xí nhưng nó hoạt động.
Tôi đã tạo một plugin jQuery để xử lý sự cố này cho Chrome khi tải xuống, bạn có thể tìm thấy ở đây
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDoader.js
Hiệu trưởng cơ bản tương tự cũng được áp dụng để tải lên.
Để sử dụng trình tải xuống (bao gồm cả JS, rõ ràng)
$('body').iDownloader({
"onComplete" : function(){
$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
}
});
$('somebuttion').click( function(){
$('#uiBlocker').css('display', 'block'); //block the UI
$('body').iDownloader('download', 'htttp://example.com/location/of/download');
});
Và về phía máy chủ, ngay trước khi chuyển dữ liệu tệp, hãy tạo cookie
setcookie('iDownloader', true, time() + 30, "/");
Plugin sẽ thấy cookie và sau đó kích hoạt onComplete
gọi lại.