Saturday, 15 July 2017

เนื้อหา การถ่ายโอน การเข้ารหัส ไบนารี ตัวเลือก


การจัดการข้อมูลไบนารีกับ Axis2 (MTOMSwA) บทนำแม้จะมีความยืดหยุ่นในการทำงานร่วมกันและการยอมรับ XML ทั่วโลก แต่ก็มีบางครั้งที่การจัดลำดับข้อมูลลงใน XML ก็ไม่สมเหตุสมผล ผู้ใช้บริการเว็บอาจต้องการส่งไฟล์แนบแบบไบนารีในรูปแบบต่างๆเช่นรูปภาพภาพวาดเอกสาร XML ฯลฯ พร้อมกับข้อความ SOAP ข้อมูลดังกล่าวมักอยู่ในรูปแบบไบนารีเฉพาะ ตามเนื้อผ้าใช้เทคนิคสองอย่างในการจัดการกับข้อมูลทึบใน XML การส่งข้อมูลไบนารีโดยค่าทำได้โดยฝังข้อมูลที่เป็นสีทึบ (แน่นอนหลังจากเข้ารหัสรูปแบบบางส่วน) เป็นองค์ประกอบองค์ประกอบหรือแอตทริบิวต์ของคอมโพเนนต์ XML ของข้อมูล ข้อได้เปรียบหลักของเทคนิคนี้คือการทำให้แอพพลิเคชันมีความสามารถในการประมวลผลและอธิบายข้อมูลโดยขึ้นอยู่กับส่วนประกอบ XML ของข้อมูลเท่านั้น XML รองรับข้อมูลทึบแสงเป็นเนื้อหาโดยใช้การเข้ารหัสข้อความ base64 หรือ hexadecimal ทั้งสองเทคนิคขยายขนาดของข้อมูล สำหรับการเข้ารหัสข้อความต้นแบบ UTF-8 การเข้ารหัสแบบ base64 จะเพิ่มขนาดของข้อมูลไบนารีโดยมีขนาดเท่ากับ 1.33 เท่าในขณะที่การเข้ารหัสฐานสิบหกจะขยายข้อมูลเป็น 2 เท่า ปัจจัยด้านบนจะเพิ่มขึ้นเป็นสองเท่าถ้าใช้การเข้ารหัสข้อความ UTF-16 ยังกังวลเป็นค่าใช้จ่ายในการประมวลผล (ทั้งจริงและการรับรู้) สำหรับรูปแบบเหล่านี้โดยเฉพาะเมื่อถอดรหัสกลับเป็นไบนารีดิบ การส่งข้อมูลไบนารีโดยการอ้างอิงทำได้โดยการแนบข้อมูลไบนารีบริสุทธิ์เป็นเอนทิตีทั่วไปที่ไม่ได้รับการยกเว้นภายนอกซึ่งอยู่ภายนอกเอกสาร XML และฝัง URI แบบอ้างอิงไปยังเอนทิตีเหล่านั้นเป็นองค์ประกอบหรือค่าแอตทริบิวต์ ป้องกันไม่ให้ข้อมูลที่ไม่จำเป็นและการสิ้นเปลืองพลังงานในการประมวลผล อุปสรรคหลักในการใช้อ็อบเจ็กต์ที่ไม่ผ่านการตรวจสอบเหล่านี้คือการพึ่งพา DTD ซึ่งเป็นอุปสรรคต่อการเป็นโมดูลรวมถึงการใช้ XML namespaces มีข้อกำหนดหลายประการที่นำมาใช้ในโลกของบริการเว็บเพื่อจัดการกับปัญหาการแนบไฟล์ไบนารีโดยใช้เทคนิคอ้างอิงอ้างอิง SOAP with Attachments เป็นตัวอย่างเช่น เนื่องจาก SOAP ห้ามไม่ให้มีการประกาศประเภทเอกสาร (DTD) ในข้อความจึงทำให้เกิดปัญหาในการไม่แสดงข้อมูลเป็นส่วนหนึ่งของข้อมูลข่าวสารดังนั้นจึงสร้างโมเดลข้อมูลสองรูป ภาพจำลองนี้เหมือนกับการส่งไฟล์แนบมาพร้อมกับข้อความอีเมล แม้ว่าเอกสารแนบเหล่านี้จะเกี่ยวข้องกับเนื้อหาข้อความ แต่จะไม่อยู่ในข้อความ ซึ่งทำให้เทคโนโลยีที่ประมวลผลและอธิบายข้อมูลจากคอมโพเนนต์ XML ของข้อมูลทำให้เกิดความผิดปกติ ตัวอย่างหนึ่งคือ WS-Security ที่ไหน MTOM มาใน MTOM (กลไกการเพิ่มประสิทธิภาพการส่งข้อความ SOAP) เป็นข้อกำหนดอื่นที่มุ่งเน้นการแก้ปัญหา quotAttachmentsquot MTOM พยายามใช้ประโยชน์จากสองเทคนิคดังกล่าวข้างต้นโดยพยายามผสานเทคนิคสองวิธี MTOM เป็นวิธีอ้างอิงอ้างอิง รูปแบบสายของข้อความที่เพิ่มประสิทธิภาพ MTOM จะเหมือนกับข้อความ SOAP ที่มีสิ่งที่แนบมาซึ่งจะทำให้สามารถใช้งานร่วมกันได้กับ SwA endpoints คุณลักษณะที่โดดเด่นที่สุดของ MTOM คือการใช้องค์ประกอบ XOP: Include ซึ่งกำหนดไว้ในข้อกำหนด XML (XOP) ของ XML เพื่ออ้างอิงไฟล์แนบ binary (องค์กรภายนอกที่ยังไม่ผ่านการคัดแยก) ของข้อความ ด้วยการใช้องค์ประกอบพิเศษนี้เนื้อหาไบนารีที่แนบมาจะกลายเป็นอินไลน์ (ตามค่า) โดยใช้เอกสาร SOAP แม้ว่าจะมีการแนบแยกกันอยู่ การรวมนี้จะรวมสองอาณาจักรด้วยการทำให้สามารถทำงานได้เฉพาะกับโมเดลข้อมูลเดียวเท่านั้น ช่วยให้แอ็พพลิเคชันสามารถประมวลผลและอธิบายได้โดยดูเฉพาะส่วนของ XML ทำให้การพึ่งพา DTDs ล้าสมัย เมื่อทราบน้ำหนักเบา MTOM ได้มาตรฐานกลไกการอ้างอิงของ SwA ต่อไปนี้เป็นสารสกัดจากข้อกำหนด XOP ในระดับแนวความคิดข้อมูลไบนารีนี้สามารถใช้เป็นฐานเข้ารหัส 64 บิตในเอกสาร XML ได้ เนื่องจากรูปแบบแนวคิดนี้อาจเป็นที่ต้องการในระหว่างการประมวลผลเอกสาร XML บางอย่าง (เช่นสำหรับการลงนามในเอกสาร XML) จำเป็นต้องมีการติดต่อกันแบบหนึ่งต่อหนึ่งระหว่าง XML Infosets และ XOP Packages ดังนั้นการแสดงข้อมูลเชิงแนวคิดของข้อมูลไบนารีจะเหมือนกับว่าเป็นแบบ base64-encoded โดยใช้รูปแบบบัญญัติศัพท์บัญญัติของ XML Schema base64Binary ประเภทข้อมูล (ดู XML Schema Part 2: Datatypes Second Edition 3.2.16 base64Binary) ในทิศทางตรงกันข้าม XOP สามารถเพิ่มประสิทธิภาพเฉพาะข้อมูลอินสเดตที่เข้ารหัส Base64 ได้ซึ่งอยู่ในรูปแบบคำศัพท์บัญญัติ Apache Axis2 สนับสนุนการเข้ารหัส Base64 SOAP พร้อมไฟล์แนบและ MTOM (SOAP Message กลไกการเพิ่มประสิทธิภาพการรับส่งข้อความ) MTOM กับ Axis2 Programming Model AXIOM เป็นโมเดลวัตถุ (และอาจเป็นคนแรก) ที่มีความสามารถในการเก็บข้อมูลไบนารี มีความสามารถนี้เนื่องจาก OMText สามารถเก็บเนื้อหาไบนารีดิบในรูปแบบ javax. activation. DataHandler OMText ได้รับเลือกเพื่อจุดประสงค์นี้ด้วยสองเหตุผล หนึ่งคือ XOP (MTOM) สามารถเพิ่มประสิทธิภาพเฉพาะข้อมูลอินสเดตที่เข้ารหัส Base64 ได้ซึ่งอยู่ในรูปแบบคำศัพท์ที่เป็นรูปแบบบัญญัติของประเภทข้อมูล Base64Binary XML Schema อีกอย่างหนึ่งคือการเก็บข้อมูลในทั้งผู้ส่งและผู้รับ (เพื่อเก็บเนื้อหาไบนารีในวัตถุชนิดเดียวกันโดยไม่คำนึงถึงว่าเหมาะหรือไม่) MTOM อนุญาตให้เข้ารหัสบางส่วนของข้อความซึ่งช่วยให้เราสามารถส่งข้อมูล base64encoded รวมทั้งข้อมูลไบนารีดิบที่แนบมาภายนอกซึ่งอ้างอิงโดยองค์ประกอบ quotXOPquot (เนื้อหาที่เหมาะสม) ที่จะส่งไปในข้อความ SOAP คุณสามารถระบุว่าโหนด OMText ที่มีข้อมูลไบนารีดิบหรือข้อมูลไบนารี base64encoded มีคุณสมบัติเหมาะสมที่จะได้รับการปรับให้เหมาะสมในขณะที่สร้างโหนดนั้นหรือใหม่กว่า เพื่อประสิทธิภาพสูงสุดของ MTOM ผู้ใช้ควรส่งไฟล์ไบนารีที่มีขนาดเล็กลงโดยใช้ไฟล์แนบแบบ base64encoding (ไม่ใช่การเพิ่มประสิทธิภาพ) และไฟล์ที่ใหญ่ขึ้น นอกจากนี้ผู้ใช้สามารถสร้างโหนดเนื้อหาไบนารีที่ดีที่สุดได้โดยใช้สตริงเข้ารหัส base64 ซึ่งมีเนื้อหาไบนารีที่เข้ารหัสซึ่งกำหนดให้กับชนิด MIME ของการแทนไบนารีที่เกิดขึ้นจริง Axis2 ใช้ javax. activation. DataHandler เพื่อจัดการกับข้อมูลไบนารี โหนดเนื้อหาแบบไบนารีที่ได้รับการปรับปรุงทั้งหมดจะถูกจัดเรียงเป็นสตริง Base64 ถ้าไม่มีการเปิดใช้ quotMTOM นอกจากนี้คุณยังสามารถสร้างโหนดเนื้อหาไบนารีซึ่งจะไม่ได้รับการปรับให้เหมาะกับกรณีใด ๆ จะถูกจัดเรียงเป็นลำดับและส่งเป็น Base64 Strings การเปิดใช้งาน MTOM Optimization บนฝั่งไคลเอ็นต์ใน Options ให้ตั้งค่าคุณสมบัติ quotenableMTOMquot เป็น True เมื่อส่งข้อความ เมื่อคุณสมบัตินี้ถูกตั้งค่าเป็น True ซองจดหมาย SOAP ใด ๆ ก็ตามไม่ว่าจะมีเนื้อหาที่ดีที่สุดหรือไม่ก็ตามจะได้รับการจัดอันดับเป็นข้อความ MIME ที่ปรับให้เหมาะ MTOM Axis2 serializes โหนดเนื้อหาไบนารีทั้งหมดเป็นสายอักขระที่เข้ารหัส Base64 ไม่ว่าจะมีคุณสมบัติเหมาะสมหรือไม่ถ้าคุณสมบัติ quotenableMTOMquot ถูกตั้งค่าเป็น False หากซองจดหมายมีรายการข้อมูลองค์ประกอบใด ๆ ของชื่อ xop: รวม (ดูการบรรจุที่เพิ่มประสิทธิภาพแบบไบนารี XML-2 XOP Infosets Constructs) ผู้ใช้ไม่จำเป็นต้องระบุอะไรเพื่อให้ Axis2 รับข้อความที่เพิ่มประสิทธิภาพ MTOM Axis2 จะระบุและจัดลำดับตามลำดับโดยอัตโนมัติเมื่อ MTOM ถึงข้อความ การเปิดใช้งานการเพิ่มประสิทธิภาพ MTOM บนฝั่งเซิร์ฟเวอร์เซิร์ฟเวอร์ Axis 2 จะระบุข้อความที่เพิ่มประสิทธิภาพ MTOM ที่เข้ามาโดยอัตโนมัติตามประเภทเนื้อหาและจะเรียงตามลำดับเวลาตามลำดับ ผู้ใช้สามารถ enableMTOM ฝั่งเซิร์ฟเวอร์สำหรับข้อความขาออกได้หากต้องการ enableMTOM ทั่วโลกสำหรับบริการทั้งหมดผู้ใช้สามารถตั้งค่าพารามิเตอร์ quotenableMTOMquot เป็น True ใน Axis2.xml เมื่อตั้งค่าข้อความขาออกทั้งหมดจะถูกจัดเรียงเป็นลำดับและส่งเป็นข้อความ MIME ที่ปรับแต่ง MTOM หากไม่มีการตั้งค่าข้อมูลไบนารีทั้งหมดในโหนดเนื้อหาไบนารีจะได้รับการจัดอันดับเป็นสตริงที่เข้ารหัส Base64 การกำหนดค่านี้สามารถ overriden ใน services. xml บนพื้นฐานของบริการและต่อการดำเนินการ คุณต้องรีสตาร์ทเซิร์ฟเวอร์หลังจากตั้งค่าพารามิเตอร์นี้ การเข้าถึงข้อมูลไบนารีที่ได้รับ (ตัวอย่างโค้ด) การเขียนเว็บเซิร์ฟเวอร์แบบง่ายๆใน python ซึ่งทำให้ผู้ใช้สามารถอัปโหลดไฟล์โดยใช้ข้อมูลหลายรูปแบบได้ เท่าที่ฉันสามารถบอกได้ข้อมูล MIME multipart ควรจะเป็นบรรทัดตาม ยกตัวอย่างเช่นเขตแดนจะต้องอยู่ที่จุดเริ่มต้นของเส้น ฉันลาดเทตัวเลขวิธีการจัดการข้อมูลไบนารีในเรื่องนี้ ลูกค้าของฉัน (Firefox) ไม่ได้เข้ารหัสเป็น ASCII 7 บิตหรือข้อมูลใด ๆ ที่เป็นข้อมูลไบนารีดิบเพียงการส่งของ มีการแยกข้อมูลออกเป็นเส้นตรงตามตำแหน่งใด ๆ มีความยาวเส้นสูงสุดที่ระบุไว้สำหรับข้อมูลหลายส่วน Ive พยายามมองหา RFC สำหรับข้อมูลหลายส่วน แต่ไม่พบอะไร ถาม 27 มีนาคม 13 เวลา 16:54 หลังจากขุดผ่าน RFCs ฉันคิดว่าฉันจนได้มันทั้งหมดตรงในหัวของฉัน ส่วนของร่างกาย (เช่นเนื้อหาเนื้อหาของแต่ละส่วนในข้อความแบบหลายส่วน) จะต้องเป็นบรรทัดเดียวตามที่ขอบเขตในตอนท้ายของส่วนเริ่มต้นด้วย CRLF แต่มิฉะนั้นข้อมูลไม่จำเป็นต้องเป็นบรรทัดฐานและถ้าเนื้อหาเกิดขึ้นมีการแพร่กระจายในระบบไม่มีระยะห่างสูงสุดระหว่างพวกเขาและไม่จำเป็นต้องหลบหนีในที่ใด ๆ (ดีเว้นแต่ Content-Transfer - การเข้ารหัสถูกยกมาเป็นสตริง) ตัวเลือก 7 บิต 8 บิตและไบนารีสำหรับ Content-Transfer-Encoding ไม่ได้ระบุว่ามีการเข้ารหัสใด ๆ ในข้อมูลใด ๆ (ดังนั้นจึงไม่จำเป็นต้องยกเลิกการเข้ารหัส) พวกเขาก็หมายถึงการระบุชนิดของข้อมูลเท่านั้น คุณสามารถคาดหวังที่จะเห็นในส่วนของร่างกาย สิ่งที่ฉันได้จริงๆที่ได้รับในคำถามแสดงไม่ดีของฉันคือวิธีอ่านบัฟเฟอร์ข้อมูลจากซ็อกเก็ตเพื่อให้ฉันสามารถตรวจสอบว่าฉันจับขอบเขตและโดยไม่ต้องมีบัฟเฟอร์ขนาดใหญ่โดยพลการ (เช่นถ้ามีเกิดขึ้นจะไม่มี linebreaks ใน เนื้อหาและเพื่อ readline สิ้นสุด buffering สิ่งทั้งหมด) สิ่งที่ฉันสิ้นสุดการทำคือ buffering จากซ็อกเก็ตกับ readline ใช้ความยาวสูงสุดดังนั้นบัฟเฟอร์จะไม่นานกว่านั้น แต่ยังจะให้แน่ใจว่าจะยุติถ้า linebreak พบ นี้มั่นใจได้ว่าเมื่อขอบเขตมา (ตาม CRLF) ก็จะเป็นที่จุดเริ่มต้นของบัฟเฟอร์ ฉันต้องทำ monkeying พิเศษเล็กน้อยรอบเพื่อให้แน่ใจว่าฉันไม่ได้รวม CRLF สุดท้ายในเนื้อหาของร่างกายที่เกิดขึ้นจริงเพราะตาม RFC ที่จำเป็นก่อนที่ขอบเขตและดังนั้นจึงไม่เป็นส่วนหนึ่งของเนื้อหาตัวเอง ตอบ 5 พ. ค. เวลา 13:02 น. ลองทบทวน RFC 2045 โดยปกติเนื้อหาไบนารีจะถูกแปลงเป็น BASE64 โดยแอปพลิเคชันของคุณและรวมอยู่ในข้อความหลายส่วนโดยใช้ Content-Transfer-Encoding Base64 มีกลไกอื่น ๆ ในการถ่ายโอนข้อมูลไบนารี แต่นี่เป็นเรื่องปกติธรรมดา ข้อมูลไบนารีจะถูกแปลงเป็น octets และแยกออกเป็นสตริงที่ยาวตามความยาว (ขึ้นอยู่กับรูปแบบการเข้ารหัส - ดูลิงก์ BASE64 ด้านบน) แอ็พพลิเคชันที่รับจะถอดรหัสมันลงในเนื้อหาไบนารีต้นฉบับ ฉันไม่ได้เป็นโปรแกรมเมอร์หลาม แต่ฉันจะแปลกใจที่คุณต้องมีรหัสนี้ด้วยตัวคุณเอง ฉันสงสัยว่ามีฟังก์ชั่นไลบรารีไพ ธ อนที่ทำไว้ล่วงหน้าเพื่อทำสิ่งนี้ให้กับคุณ ตอบ 27 มีนาคม 13 ที่ 17:43 ขอบคุณผมกำลังมองหาที่แตกต่างกัน RFC ซึ่งไม่เป็นข้อมูล นอกจากนี้ฉันยังพบ RFC 2046 ซึ่งกำหนดข้อความส่วนมากในส่วนที่ 5 โปรดทราบว่ามีความละเอียดอ่อนเล็กน้อยใน RFCs เหล่านี้ซึ่งทำให้ฉันไม่ได้กล่าวว่าข้อความ multipart ไม่สามารถเข้ารหัสอื่น ๆ ได้เช่น 7 บิต 8 บิตและไบนารี (ไม่ใช่ Base-64) อย่างไรก็ตามกล่าวต่อไปว่าแต่ละส่วนภายในหลายส่วนอาจมีการเข้ารหัสเนื้อหาของตัวเองดังนั้นคุณจึงแก้ไขได้ว่า Base-64 เป็นไปได้ ndash brianmearns Mar 28 13:20 Your Answer 2017 Stack Exchange, Incdescription void ส่วนหัว (string string, bool แทน true, int httpresponsecode) ส่วนหัว () ใช้เพื่อส่งส่วนหัว HTTP ดิบ ดูข้อมูลจำเพาะ raquo HTTP1.1 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับส่วนหัว HTTP โปรดจำไว้ว่าต้องมีการเรียกส่วนหัว () ก่อนที่ผลลัพธ์จริงจะถูกส่งโดยแท็ก HTML ปกติบรรทัดว่างในไฟล์หรือจาก PHP เป็นข้อผิดพลาดทั่วไปในการอ่านรหัสพร้อมด้วย หรือต้องการ ฟังก์ชันหรือฟังก์ชันการเข้าถึงไฟล์อื่น ๆ และมีช่องว่างหรือบรรทัดว่างที่จะถูกส่งออกก่อนเรียกใช้ส่วนหัว () มีปัญหาเดียวกันเมื่อใช้ไฟล์ PHPHTML เดียว lthtmlgt ltphp นี่จะเป็นข้อผิดพลาด หมายเหตุเอาต์พุตข้างต้นซึ่งอยู่ก่อนส่วนหัวของ header () (Location: example) exit GT พารามิเตอร์สตริงส่วนหัว มีสองสายส่วนหัวของกรณีพิเศษ ส่วนหัวแรกคือส่วนหัวที่ขึ้นต้นด้วยสตริงที่มีเครื่องหมาย HTTP (กรณีไม่สำคัญ) ซึ่งจะใช้เพื่อค้นหารหัสสถานะ HTTP ที่จะส่ง ตัวอย่างเช่นถ้าคุณได้กำหนดค่า Apache เพื่อใช้สคริปต์ PHP เพื่อจัดการกับคำขอไฟล์ที่ขาดหายไป (โดยใช้ ErrorDocument directive) คุณอาจต้องการตรวจสอบให้แน่ใจว่าสคริปต์ของคุณสร้างรหัสสถานะที่ถูกต้อง ส่วนหัว ltphp (ไม่พบ HTTP1.0 404) gt กรณีพิเศษที่สองคือส่วนหัวของ quotLocation: quot ไม่เพียงส่งส่วนหัวนี้กลับไปที่เบราว์เซอร์ แต่จะส่งคืนรหัสสถานะ REDIRECT (302) ไปยังเบราเซอร์เว้นแต่รหัสสถานะ 201 หรือรหัสสถานะ 3xx ได้รับการตั้งค่าแล้ว ส่วนหัว ltphp (ตำแหน่ง: ตัวอย่าง) เบราว์เซอร์เปลี่ยนเส้นทางตรวจสอบว่าโค้ดด้านล่างไม่ได้รับการดำเนินการเมื่อเราเปลี่ยนเส้นทาง exit gt พารามิเตอร์แทนที่ที่ระบุระบุว่าส่วนหัวควรแทนที่ส่วนหัวก่อนหน้าที่เหมือนกันหรือเพิ่มส่วนหัวที่สองของประเภทเดียวกัน โดยค่าเริ่มต้นจะแทนที่ แต่ถ้าคุณส่ง FALSE เป็นอาร์กิวเมนต์ที่สองคุณสามารถบังคับให้มีหลายส่วนหัวของชนิดเดียวกันได้ ตัวอย่างเช่นส่วนหัวของ ltphp (WWW-Authenticate: Negotiate) (WWW-Authenticate: NTLM. false) gt บังคับให้โค้ดการตอบสนอง HTTP เป็นค่าที่ระบุ โปรดสังเกตว่าพารามิเตอร์นี้มีผลเฉพาะถ้าสตริงไม่ว่างเปล่า เป็นสิ่งสำคัญที่จะต้องทราบว่าส่วนหัวจะถูกส่งจริงเมื่อไบต์แรกถูกส่งออกไปยังเบราเซอร์ ถ้าคุณกำลังแทนที่ส่วนหัวในสคริปต์ของคุณนั่นหมายความว่าตำแหน่งของงบ echoprint และบัฟเฟอร์ผลลัพธ์อาจส่งผลต่อส่วนหัวที่ถูกส่งไปจริง ในกรณีของการเปลี่ยนเส้นทางหากคุณลืมยกเลิกสคริปต์หลังจากส่งส่วนหัวการเพิ่มบัฟเฟอร์หรือการส่งอักขระอาจเปลี่ยนหน้าเว็บที่ผู้ใช้ของคุณถูกส่งไป การเปลี่ยนเส้นทางนี้เป็น 2.html เนื่องจากส่วนหัวที่สองจะแทนที่ข้อความแรก ส่วนหัว ltphp (ตำแหน่ง: 1.html) ส่วนหัว (ตำแหน่ง: 2.html) แทนที่ 1.html gt เปลี่ยนเส้นทางเป็น 1.html เนื่องจากส่วนหัวจะถูกส่งไปให้เร็วที่สุดเท่าที่จะเกิด echo นอกจากนี้คุณยังไม่เคยเห็นส่วนหัวใด ๆ ที่ส่งข้อผิดพลาดเนื่องจากเบราว์เซอร์เปลี่ยนเส้นทางไปก่อนที่จะสามารถแสดงข้อผิดพลาดได้ ส่วนหัวของ ltphp (ตำแหน่ง: 1.html) echo ส่งข้อมูลส่วนหัว (ที่ตั้ง: 2.html) 1.html ส่งเรียบร้อยแล้ว gt ห่อตัวตัวอย่างก่อนหน้านี้ในบัฟเฟอร์เอาต์พุตจริงเปลี่ยนลักษณะการทำงานของสคริปต์เนื่องจากส่วนหัว arent ส่งถึงผลลัพธ์ บัฟเฟอร์ถูกล้าง ส่วนหัวของ ltphp obstart () (ตำแหน่ง: 1.html) echo ส่งข้อมูลส่วนหัว (ตำแหน่ง: 2.html) แทนที่ 1.html obendflush () ขณะนี้ส่วนหัวจะถูกส่งไป gt ไฟล์ของฉันอยู่ในสถานะบีบอัด (bz2) เมื่อผู้ใช้คลิกลิงก์ฉันต้องการให้พวกเขาได้รับไฟล์ที่ไม่มีการบีบอัด หลังจากที่คลายการบีบอัดไฟล์ฉันพบปัญหาที่กล่องโต้ตอบการดาวน์โหลดจะปรากฏขึ้นเสมอแม้ว่าฉันจะพูดโต้ตอบเพื่อดำเนินการนี้กับไฟล์ประเภทนี้ทุกครั้ง ขณะที่ฉันพบปัญหาอยู่ในส่วนหัวของ Content-Disposition ได้แก่ directive แนบ หากคุณต้องการให้เบราว์เซอร์จำลองลิงก์ธรรมดาไปยังไฟล์ให้เปลี่ยนไฟล์แนบไปเป็นไฟล์แบบอินไลน์หรือลบล้างสิ่งต่างๆทั้งหมดและคุณจะไม่เป็นไร นี้เอาฉันสักครู่เพื่อคิดออกและฉันหวังว่ามันจะช่วยให้คนอื่นออกมีที่ทำงานเป็นปัญหาเดียวกัน การบันทึกไฟล์ php ใน ANSI ไม่มี isuess แต่เมื่อบันทึกไฟล์ในรูปแบบ UTF-8 ด้วยเหตุผลหลายประการโปรดอย่าลืมบันทึกไฟล์โดยไม่มีการสนับสนุน BOM (byte-order mark) มิฉะนั้นคุณจะประสบปัญหาของหัวไม่ถูกส่งอย่างถูกต้องเช่น ส่วนหัวของ ltphp (Set-Cookie: nameuser) gt จะให้ข้อมูลดังนี้: - คำเตือน: ไม่สามารถแก้ไขข้อมูลส่วนหัว - ส่วนหัวที่ส่งไปแล้วโดย (การส่งออกเริ่มต้นที่ C: wwwinfo. php: 1) ใน C: wwwinfo. php ในบรรทัดที่ 1 ตาม ไปที่ RFC 6226 (tools. ietf. orghtmlrfc6266) วิธีเดียวในการส่ง Content-Disposition Header ที่มีการเข้ารหัส ได้แก่ Content-Disposition: ชื่อไฟล์ที่แนบ UTF-8e282ac20rates สำหรับความเข้ากันได้ย้อนหลังสิ่งที่ควรจะส่งคือ Content-Disposition: attachment filenameEURO rate filenameutf-8e282ac20rates ด้วยเหตุนี้เราจึงควรใช้ชื่อไฟล์ ltphp. exe ชื่อไฟล์ในเนื้อหาอักษรจีน Content_DispositionField Content Disposition: attachment sprintf (ชื่อไฟล์ rawurlencode (filename)) sprintf (filenameutf-8s. rawurlencode (filename)) header (Content-Type: applicationoctet-stream) readfile (filetodownload. exe) ฉันได้ทดสอบโค้ดใน IE6-10, firefox และ Chrome แล้ว สำหรับไฟล์ขนาดใหญ่ (100 MB) ฉันพบว่าจำเป็นต้องล้างเนื้อหาของไฟล์ ASAP มิฉะนั้นกล่องโต้ตอบการดาวน์โหลดจะไม่แสดงเป็นเวลานานหรือไม่ ส่วนหัวของ ltphp (Content-Disposition: ชื่อไฟล์ที่แนบมา urlencode (file)) header (Content-Type: applicationforce-download) header (Content-Type: applicationoctet-stream) ส่วนหัว (Content-Type: applicationdownload) header (Content-Description: File โอน) ส่วนหัว (Content-Length:. sizeize (file)) ล้าง () นี้ไม่สำคัญจริงๆ fp fopen (file r) while (feof (fp)) echo fread (fp. 65536) flush () เป็นสิ่งสำคัญสำหรับการดาวน์โหลดไฟล์ขนาดใหญ่ fclose (fp) gt หากคุณไม่ใช้งาน HTTP Response 204 จะสะดวกมาก 204 บอกเซิร์ฟเวอร์ให้สามารถขอคำร้องนี้ได้ทันที วิธีนี้จะเป็นประโยชน์ถ้าคุณต้องการให้ฟังก์ชันฝั่งไคลเอ็นต์ javascript (หรือคล้าย ๆ กัน) รันฟังก์ชันฝั่งเซิร์ฟเวอร์โดยไม่รีเฟรชหรือเปลี่ยนหน้าเว็บปัจจุบัน เหมาะสำหรับการอัพเดตฐานข้อมูลการตั้งค่าตัวแปรส่วนกลางส่วนหัวส่วนหัว (สถานะ: 204) (หรือสายอื่น ๆ ) (HTTP1.0 204 ไม่มีการตอบสนอง) การเรียก sessionwriteclose () ก่อนคำสั่ง ltphp header (Location: URL) exit ) gt แนะนำหากคุณต้องการให้แน่ใจว่าเซสชันได้รับการอัปเดตก่อนดำเนินการต่อเพื่อเปลี่ยนเส้นทาง เราพบสถานการณ์ที่สคริปต์เข้าถึงโดยการเปลี่ยนเส้นทางไม่ได้โหลดเซสชันได้อย่างถูกต้องเนื่องจากสคริปต์ก่อนหน้าไม่ได้เวลาในการอัปเดต (เราใช้ตัวจัดการฐานข้อมูล) เพียงเพื่อแจ้งให้คุณทราบทั้งหมดอย่าสับสนระหว่าง Content-Transfer-Encoding และ Content-Encoding Content-Transfer-Encoding ระบุการเข้ารหัสที่ใช้เพื่อถ่ายโอนข้อมูลภายในโปรโตคอล HTTP เช่นไบนารีดิบหรือ base64 (ไบนารีมีขนาดกะทัดรัดกว่า base64 base64 มีค่าใช้จ่าย 33) ตัวอย่างเช่นใช้: - ส่วนหัว (Content-Transfer-Encoding: binary) Content-Encoding ใช้เพื่อใช้สิ่งต่างๆเช่นการบีบอัด gzip ไปยัง contentdata ตัวอย่างเช่นใช้: - ส่วนหัว (Content-Encoding: gzip) คุณสามารถใช้ HTTPs etags และวันที่แก้ไขล่าสุดเพื่อให้แน่ใจว่าคุณจะไม่ได้ส่งข้อมูลเบราว์เซอร์ที่มีอยู่แล้วในแคช ltphp lastmodifiedtime filemtime (file) etag md5file (file) ส่วนหัว (แก้ไขล่าสุด:.gmdate (D, d MYH: i: s. lastmodifiedtime).thread (Etag: etag) if (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime trim ( SERVER HTTPIFNONEMATCH) etag) header (HTTP1.1 304 Not Modified) exit gt หากคุณต้องการลบส่วนหัวและเก็บไว้ไม่ให้ถูกส่งเป็นส่วนหนึ่งของการตอบสนองส่วนหัวเพียงแค่ให้อะไรเป็นค่าส่วนหัวหลังจากชื่อส่วนหัว ตัวอย่างเช่น. PHP โดยค่าเริ่มต้นจะส่งกลับส่วนหัวต่อไปนี้: การตอบสนองส่วนหัวทั้งหมดของคุณจะมีลักษณะเหมือน HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered - โดย: PHP5.2.8 วันที่: Fri, 16 Oct 2009 23: 05:07 GMT ชนิดเนื้อหา: texthtml charsetUTF-8 การเชื่อมต่อ: ปิดถ้าคุณเรียกใช้ชื่อส่วนหัวโดยไม่มีค่าเช่นนี้ ส่วนหัวของคุณมีลักษณะดังนี้ HTTP1.1 200 OK Server: Apache2.2.11 (Unix) X-Powered by: PHP5.2.8 วันที่: Fri, 16 Oct 2009 23:05:07 GMT การเชื่อมต่อ: close ฉันต้องการเพิ่ม เพราะฉันเห็นที่นี่มีรูปแบบที่ไม่ถูกต้อง 1. ส่วนหัวที่ใช้ทั้งหมดมีอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ดังนั้นคุณต้องทำตามนี้ ตัวอย่างเช่นตำแหน่งที่ตั้งไม่ใช่ตำแหน่งประเภทเนื้อหาไม่ใช่ประเภทเนื้อหาและ CONTENT-TYPE 2. จะต้องมีลำไส้ใหญ่และช่องว่างเช่น good: header (Content-Type: textplain) ผิด: header (Content-Type: textplain ) 3. ส่วนหัวของตำแหน่งต้องเป็น uri แน่นอนด้วยโครงร่างโดเมนพอร์ตเส้นทาง ฯลฯ 4. URIs สัมพัทธ์ไม่ได้รับอนุญาตผิด: ตำแหน่ง: something. phpa1 ผิด: ตำแหน่ง a1 จะทำให้พร็อกซีเซิร์ฟเวอร์และไคลเอ็นต์ http มีความสุขมากขึ้น หลังจากการค้นคว้าวิจัยและการทดสอบเป็นจำนวนมากแล้วเราต้องการแบ่งปันผลการวิจัยของฉันเกี่ยวกับปัญหาของฉันเกี่ยวกับ Internet Explorer และการดาวน์โหลดไฟล์ ลองดูโค้ดนี้ซึ่งจะจำลองการดาวน์โหลด Javascript เป็นแบบปกติ: ltphp if (strstr (SERVER HTTPUSERAGENT, MSIE) false) header (Content-type: textjavascript) header (content-Disposition: inline filenamedownload. js) header (Content ความยาว: file (my-file. js)) ส่วนหัวอื่น (Content-type: applicationforce-download) ส่วนหัว (content-disposition: attachment filenamedownload. js) ส่วนหัว (Content-Length:. filesize (my-file. js) ) หัวข้อ (Expires: Fri, 01 Jan 2010 เวลา 05:00:00 GMT) if (strstr (SERVER HTTPUSERAGENT, MSIE) false) หัวกระดาษ (Cache-control: no-cache) ส่วนหัว (Pragma: no-cache) ประกอบด้วย (my - file. js) gt ตอนนี้ให้ฉันอธิบาย: ฉันเริ่มต้นโดยการตรวจสอบ IE แล้วถ้าไม่ IE ผมตั้ง Content - type (case - sensitive) เพื่อ JS และตั้ง Content - Disposition (ทุกส่วนหัวเป็นกรณี ๆ ไปจากนี้ ) เป็นบรรทัดในเนื่องจากเบราว์เซอร์ส่วนใหญ่ภายนอก IE ต้องการแสดง JS แบบอินไลน์ (ผู้ใช้อาจเปลี่ยนแปลงการตั้งค่า) ส่วนเบราว์เซอร์บางเบราว์เซอร์จะต้องมีส่วนหัว Content-Length เพื่อเปิดใช้งานกล่องดาวน์โหลด จากนั้นถ้าเป็น IE แอ็พพลิเคชัน - ดาวน์โหลด Content-type บางครั้งจะต้องแสดงกล่องดาวน์โหลด ใช้ตัวเลือกนี้หากคุณไม่ต้องการให้ PDF แสดงในเบราเซอร์ (ใน IE) ฉันใช้ที่นี่เพื่อให้แน่ใจว่ากล่องเปิดขึ้น อย่างไรก็ตามฉันได้กำหนด Content-Disposition ไว้ในไฟล์แนบแล้วเนื่องจากฉันรู้อยู่แล้วว่ากล่องจะปรากฏขึ้น แล้วฉันก็มี Content-Length อีกครั้ง ตอนนี้ heres จุดใหญ่ของฉัน ฉันมีส่วนหัว Cache-Control และ Pragma ที่ส่งเฉพาะถ้าไม่ใช่ IE HEADERS เหล่านี้จะป้องกันการดาวน์โหลดบน IE ใช้เฉพาะหัวข้อ Expires เพราะจะต้องดาวน์โหลดไฟล์อีกครั้งในครั้งต่อไป นี่ไม่ใช่ข้อผิดพลาดที่ IE เก็บการดาวน์โหลดไว้ในโฟลเดอร์ Temporary Internet Files จนกว่าการดาวน์โหลดจะเสร็จสมบูรณ์ ฉันรู้เรื่องนี้เพราะเมื่อฉันดาวน์โหลดไฟล์ขนาดใหญ่ไปยัง My Documents แต่กล่องโต้ตอบ Download Dialiat ได้ใส่ไว้ในโฟลเดอร์ Temp แล้วย้ายไปที่ตอนท้าย แค่คิดถึงมัน หาก IE ต้องการไฟล์ที่จะดาวน์โหลดไปยังโฟลเดอร์ Temp การตั้งค่าส่วนหัว Cache-Control และ Pragma จะทำให้เกิดข้อผิดพลาดฉันหวังว่านี่จะช่วยให้ใครบางคนได้เวลานี่คือสคริปต์ PHP ที่ฉันเขียนเพื่อสตรีมไฟล์และฝังไว้ในเครื่องด้วยการดำเนินการ xor ในไบต์และด้วยคีย์ การเข้ารหัสทำงานได้ดีมาก แต่ความเร็วลดลง 2 เท่านั่นก็คือ 520KiBs ผู้ใช้จะขอรหัสผ่าน md5 (แทนที่จะเก็บไว้ในรหัสโดยตรง) มีบางส่วนในภาษาฝรั่งเศสเนื่องจากภาษาพื้นเมืองของฉันจึงแก้ไขตามที่คุณต้องการ ltphp สตรีมไฟล์และเข้ารหัสข้อมูล on-the-fly การตั้งค่า - ไฟล์ไปยังไฟล์สตรีม FILEout - การอ่านบัฟเฟอร์ bufferlength 3840 - คีย์ hex keychar 9cdfb439c7876e703e307864c9167a15 ฟังก์ชัน: คีย์การแปลงค่า hex เป็นสตริงเป็นฟังก์ชันไบนารี hex2bin (h) if ( isstring (h)) return null r array () for (0 (a 2) lt strlen (h) a) ta hexdec (h 2 a) tb hexdec (h (2 a 1)) ra (int) ((ta ltlt 4) tb) return r ฟังก์ชันเพื่อส่งส่วนหัว auth authPicture (ข้อความใส่รหัสผ่าน) ส่วนหัว (WWW - Authenticate: realm พื้นฐาน utf8decode (text)) ส่วนหัว (HTTP1.0 401 Unauthorized) return 1 คีย์ถูกถามที่ เริ่มต้นครั้งแรกถ้า (isset (SERVER PHPAUTHPW)) askPassword () echo Une cl est ncessaire ltbr gt ออกรับกุญแจสำคัญใน hex keychar SERVER PHPAUTHPW แปลงคีย์และกำหนดขนาดของ key key hex2bin (keychar) keylength count (key) Teste si la cl est valide en hex ถ้า (คีย์ keylength lt 4) askPassword (Cl ไม่ถูกต้อง) echo cl invalide ltbr gt exit () teste si la cl est longueur dune puissance de 2 if ((keylength 2) 0) askPassword (Cl de longueur ไม่ถูกต้อง (หลาย 2 ซ้ำ)) echo Cl de longueur inace (puissance de 2 uniquement ) ltbr gt exit () หัวส่วนหัว (Content-Type: applicationoctet-stream) ส่วนหัว (Content-Transfer-Encoding: binary) ส่วนหัว (Content-Length:. ไฟล์ (ไฟล์) ) ส่วนหัว (ชื่อไฟล์.) ล้าง () นี้ไม่ได้เรื่องจริงๆ การเปิดไฟล์ในไฟล์ fp fopen อ่านอย่างเดียว (ไฟล์. r) ในขณะที่ (feof (fp)) อ่านขนาดบัฟเฟอร์ของไฟล์ buffer fread (fp. bufferlength) j 0 สำหรับ (i 0 i lt bufferlength i) อ่านคีย์ (i keylength 0) j 0 ใช้การดำเนินการ xor ระหว่างคีย์กับไฟล์ไปฝังศพใต้ถุนโบสถ์การดำเนินการนี้จะกินเวลา CPU จำนวนมาก (สตรีมที่ 1MiB บนเซิร์ฟเวอร์ Intel E2180) tmp pack (C. (fp) exit () ปิดไฟล์และ fclose ที่เสร็จสิ้น (fp) () f (fp) () f (x) ) หลีกเลี่ยง ZERO BYTE ORDER MARK ส่วนหัวจะต้องส่งก่อนทุกอย่างในหน้า แม้แต่เนื้อที่เดียวจะทำให้สคริปต์ของคุณเสียหาย ในกรณีของฉันมี BOM ตั้งอยู่ในการเข้ารหัสดังนั้นฉันจึงเปิดไฟล์ด้วย notepad และตั้งค่าการเข้ารหัสเป็น UTF-8 (ไม่มี BOM) และ voila ทุกอย่างทำงานได้ดีในขณะนี้ ฉันใช้เวลานานในการพิจารณาว่าเหตุใด Internet Explorer 7 จึงไม่แจ้งให้ผู้ใช้บันทึกการดาวน์โหลดโดยอิงจากชื่อไฟล์ที่ระบุใน Content-Disposition: attachment filename บรรทัดแรก ฉันได้กำหนดว่าการติดตั้ง Apache ของฉันเพิ่มส่วนหัวเพิ่มเติม: Vary: Host ซึ่งกำลังโยน IE - ตามการ support. microsoftkb824847 ฉันพบด้วยตนเองการตั้งค่าส่วนหัว Vary จากภายใน PHP ดังต่อไปนี้ส่วนหัว (Vary: User-Agent) อนุญาตให้ IE ไป ทำงานตามที่ตั้งใจ หวังว่านี่จะเป็นการช่วยคนอื่นสักระยะหนึ่งการเข้ารหัสของไฟล์จะถูกค้นพบโดย Content-Type ทั้งในเมตาแท็ก HTML หรือเป็นส่วนหัวของ HTTP ดังนั้นเซิร์ฟเวอร์และเบราว์เซอร์ไม่จำเป็นต้องใช้หรือคาดหวังไฟล์ Unicode เพื่อเริ่มต้นด้วยเครื่องหมาย BOM นอกจากนี้ BOM อาจสับสนกับระบบ Nix ด้วย ข้อมูลเพิ่มเติมที่ unicode. orgfaqutfbom. htmlbom1 หมายเหตุอื่น: Safari สามารถแสดงรูปภาพ CMYK (อย่างน้อยเวอร์ชัน OS X เนื่องจากใช้บริการของ QuickTime) การตั้งค่าส่วนหัว Location จะส่งคืนรหัสสถานะ REDIRECT (302) ไปยังเบราเซอร์เว้นแต่ 201 หรือรหัสสถานะ 3xx ได้รับการตั้งค่าเรียบร้อยแล้ว หากคุณกำลังส่งคำตอบไปยังคำขอ POST คุณอาจต้องการดู RFC 2616 หัวข้อ 10.3.3 และ 10.3.4 ขอแนะนำว่าถ้าคุณต้องการให้เบราว์เซอร์รีบไปหารีซอร์สในส่วนหัวตำแหน่งในกรณีนี้คุณควรใช้รหัสสถานะ 303 ไม่ใช่ 302 (มีลิงก์เดียวกันกับไฮเปอร์เท็กซ์ในร่างกายสำหรับเบราว์เซอร์เก่ามาก) ซึ่งอาจมีผล (ไม่ค่อยพบ) ตามที่ระบุไว้ในข้อบกพร่อง 42969

No comments:

Post a Comment