วิธีที่ง่ายที่สุดและแข็งแกร่งที่สุดที่ฉันเคยทำในอดีตคือการกำหนดเป้าหมายแท็ก iFrame ที่ซ่อนอยู่ในแบบฟอร์มของคุณ - จากนั้นจะส่งภายใน iframe โดยไม่ต้องโหลดหน้าซ้ำ
นั่นคือถ้าคุณไม่ต้องการใช้ปลั๊กอิน JavaScript หรือรูปแบบอื่น ๆ ของ "เวทย์มนตร์" นอกเหนือจาก HTML แน่นอนว่าคุณสามารถรวมสิ่งนี้กับ JavaScript หรือสิ่งที่คุณมี ...
<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>
คุณยังสามารถอ่านเนื้อหาของ iframe onLoad
เพื่อหาข้อผิดพลาดของเซิร์ฟเวอร์หรือการตอบสนองต่อความสำเร็จแล้วส่งออกไปยังผู้ใช้
Chrome, iFrames และ onLoad
- หมายเหตุ - คุณต้องอ่านต่อไปหากคุณสนใจที่จะตั้งค่า UI blocker เมื่อทำการอัพโหลด / ดาวน์โหลด
ปัจจุบัน Chrome ไม่เรียกใช้งานกิจกรรม onLoad สำหรับ iframe เมื่อใช้เพื่อถ่ายโอนไฟล์ Firefox, IE และ Edge ทั้งหมดใช้ไฟเหตุการณ์ onload สำหรับการถ่ายโอนไฟล์
ทางออกเดียวที่ฉันพบว่าใช้ได้กับ Chrome คือการใช้คุกกี้
ในการทำเช่นนั้นโดยทั่วไปเมื่อเริ่มอัพโหลด / ดาวน์โหลด:
- [ฝั่งไคลเอ็นต์] เริ่มต้นช่วงเวลาเพื่อค้นหาการมีอยู่ของคุกกี้
- [ฝั่งเซิร์ฟเวอร์] ทำทุกสิ่งที่คุณต้องการด้วยข้อมูลไฟล์
- [ฝั่งเซิร์ฟเวอร์] ตั้งค่าคุกกี้สำหรับช่วงเวลาฝั่งไคลเอ็นต์
- [ฝั่งไคลเอ็นต์] ช่วงเวลาที่เห็นคุกกี้และใช้มันเหมือนเหตุการณ์ onLoad ตัวอย่างเช่นคุณสามารถเริ่ม UI blocker และจากนั้นโหลด (หรือเมื่อทำคุกกี้) คุณจะลบ UI blocker
การใช้คุกกี้สำหรับสิ่งนี้น่าเกลียด แต่ใช้งานได้
ฉันสร้างปลั๊กอิน jQuery เพื่อจัดการปัญหานี้สำหรับ Chrome เมื่อดาวน์โหลดคุณสามารถค้นหาได้ที่นี่
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
หลักการพื้นฐานเดียวกันนี้ใช้กับการอัปโหลดเช่นกัน
ในการใช้ตัวดาวน์โหลด (รวมถึง JS อย่างชัดเจน)
$('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');
});
และที่ฝั่งเซิร์ฟเวอร์ก่อนที่จะถ่ายโอนข้อมูลไฟล์ให้สร้างคุกกี้
setcookie('iDownloader', true, time() + 30, "/");
ปลั๊กอินจะเห็นคุกกี้แล้วเปิดใช้งานการonComplete
เรียกกลับ