CakePHP 2.x - เข้าถึง php://input โดยตรงเพื่อจัดการกับเนื้อหาคำขอขนาดใหญ่

ฉันกำลังทำงานกับแอปพลิเคชันที่มี REST API ขนาดเล็ก หนึ่งในวิธีการเหล่านี้จำเป็นต้องยอมรับการอัปโหลดไฟล์ไบนารีขนาดใหญ่ (เกือบ 300MB) ตามคำขอ PUT

เนื่องจากไฟล์มีขนาดค่อนข้างใหญ่ และเนื่องจากมีความเสี่ยงที่คำขอดังกล่าวหลายรายการจะทำงานพร้อมกัน ฉันจึงต้องการหลีกเลี่ยงการเก็บเนื้อหาคำขอทั้งหมดไว้ในหน่วยความจำ ฉันหวังที่จะทำเช่นนี้โดยการอ่านจากสตรีม php://input โดยตรงและแยกออกเป็นไฟล์

อย่างไรก็ตาม ดูเหมือนว่าวิธี input() ของคอนโทรลเลอร์กำลังรบกวน ฉันเข้าใจเหตุผลของ input() เมื่อคุณอ่านสตรีม php://input แล้ว สตรีมนั้นจะหายไป ดังนั้น input() จึงเก็บไว้เพื่อเข้าถึงซ้ำ แน่นอนว่านี่คือพฤติกรรมที่ฉันต้องการหลีกเลี่ยงในกรณีนี้

ดูเหมือนว่า input() จะถูกเรียกที่ไหนสักแห่งก่อนที่โค้ดคอนโทรลเลอร์ของฉันจะทำงาน เพราะเมื่อถึง php://input ก็ไม่มีอะไรเหลือให้อ่านแล้ว

ดังนั้น คำถามของฉัน: มีวิธีใดที่คอนโทรลเลอร์ CakePHP จะสตรีมเนื้อหาคำขอที่มีขนาดใหญ่มากไปยังดิสก์โดยไม่ต้องโหลดทั้งหมดลงในหน่วยความจำก่อนหรือไม่


person eaj    schedule 12.02.2013    source แหล่งที่มา


คำตอบ (1)


ฉันคิดออกแล้ว ดังนั้นฉันหวังว่าสิ่งต่อไปนี้จะช่วยคนอื่นประหยัดเวลาได้บ้าง

สิ่งนี้กลายเป็นข้อผิดพลาดในส่วนของฉัน แต่ไม่เกี่ยวข้องกับ CakePHP หากคุณอ่าน php://input จากคอนโทรลเลอร์ของคุณโดยไม่ต้องเรียก Controller::input() คุณจะได้รับ (โดยปกติ) จะได้รับเนื้อหาคำขอดิบตามที่คุณคาดหวัง

ปัญหาของฉันคือฉันตั้งค่าส่วนหัวคำขอ Content-Type: application/json โดยไม่ได้ตั้งใจ สิ่งนี้ทำให้โค้ด REST ของ CakePHP พยายามแยกส่วนเนื้อหาเป็นอินพุต เมื่อฉันตั้งค่าประเภทอย่างถูกต้อง (ในกรณีของฉัน application/x-gzip) ทุกอย่างทำงานได้อย่างถูกต้อง

person eaj    schedule 22.02.2013