2010-09-12 5 views
7

मैं ब्राउज़र में आउटपुट करने के लिए एक चर में GZip सामग्री को करने का प्रयास कर रहा हूं। शुरू करने के लिए मैं इसे बहुत आसान बना रहा हूं और उन ब्राउज़रों के बारे में चिंता नहीं कर रहा हूं जो gzip का समर्थन नहीं करते हैं। इसके अलावा मैंने इसे वेब पर कई तरीकों से शोध करने से एक साथ रखा है। उनमें से कुछ लोग जो इस प्रश्न को पढ़ रहे हैं।GZip कोल्डफ्यूजन से आउटपुट के लिए स्ट्रिंग के परिणामस्वरूप ब्राउज़र में "सामग्री एन्कोडिंग त्रुटि" में परिणाम

<cfsavecontent variable="toGZIP"><html><head><title>Test</title></head><body><h1>Fear my test</h1></body></html></cfsavecontent> 

<cfscript> 
ioOutput = CreateObject("java","java.io.ByteArrayOutputStream"); 
gzOutput = CreateObject("java","java.util.zip.GZIPOutputStream"); 

ioOutput.init(); 
gzOutput.init(ioOutput); 

gzOutput.write(toGZIP.getBytes("UTF-8"), 0, Len(toGZIP.getBytes())); 

gzOutput.finish(); 
gzOutput.close(); 
ioOutput.flush(); 
ioOutput.close(); 

toOutput=ioOutput.toString("UTF-8"); 
</cfscript> 

<cfcontent reset="yes" /><cfheader name="Content-Encoding" value="gzip"><cfheader name="Content-Length" value="#ArrayLen(toOuptut.getBytes())#" ><cfoutput>#toOuptut#</cfoutput><cfabort /> 

लेकिन मैं फ़ायरफ़ॉक्स (और क्रोम और सफारी) में कोई त्रुटि मिलती है

सामग्री एन्कोडिंग त्रुटि

जो पृष्ठ आप देखने की कोशिश कर रहे दिखाया नहीं जा सकता है क्योंकि यह एक अमान्य या असमर्थित का उपयोग करता है संपीड़न का रूप।

किसी के पास कोई विचार है?

ओएस: मैक OX-X Snow Leopard
सीएफ: 9-देव
वेबसर्वर: अपाचे


समाधान

<cfsavecontent variable="toGZIP"><html><head><title>Test</title></head><body><h1>Fear my test</h1></body></html></cfsavecontent> 

<cfscript> 
ioOutput = CreateObject("java","java.io.ByteArrayOutputStream"); 
gzOutput = CreateObject("java","java.util.zip.GZIPOutputStream"); 

ioOutput.init(); 
gzOutput.init(ioOutput); 

gzOutput.write(toGZIP.getBytes(), 0, Len(toGZIP.getBytes())); 

gzOutput.finish(); 
gzOutput.close(); 
ioOutput.flush(); 
ioOutput.close(); 

toOutput=ioOutput.toByteArray(); 
</cfscript> 

<cfheader name="Content-Encoding" value="gzip"><cfheader name="Content-Length" value="#ArrayLen(toOutput)#" ><cfcontent reset="yes" variable="#toOutput#" /><cfabort /> 
+0

@ tyler-- आप अभी भी इस वापसी का उपयोग कर रहे हैं और आप gzip प्रक्रिया आंतरिक रूप से प्रबंधित करने से अच्छे परिणाम देख रहे हैं? मैं इसे खुद भी करने की कोशिश करना चाहता हूं। मुझे आईआईएस 7.0 को गतिशील सामग्री (.cfm) पृष्ठों को gzip करने के लिए नहीं मिल सकता है, हालांकि यह दावा कर सकता है। क्या आपने कभी आईआईएस को ऐसा करने की कोशिश की है? –

+0

मैंने आईआईएस को गतिशील पृष्ठों को gzip करने की कोशिश नहीं की है, हालांकि मुझे नहीं लगता कि मैं ऐसा करना चाहता हूं क्योंकि यह प्रति अनुरोध ओवरहेड का जबरदस्त उत्पादन करेगा। Gzipped सामग्री का प्रबंधन काम करता है। मुझे अभी तक इसकी सीमाओं का पूरी तरह से परीक्षण करने का अवसर नहीं मिला है, लेकिन मुझे जल्द ही उम्मीद है। –

उत्तर

4

पालन लाइन पूरी तरह से गलत लग रही है:

toOutput=ioOutput.toString("UTF-8"); 

आप यूटीएफ 8 के साथ जीजेपी स्ट्रीम को एन्कोड करते हैं। नतीजा कचरा डेटा है। यदि आप कोल्डफ्यूजन के पास विकल्प है तो सबसे अच्छा आप GZip डेटा को द्विआधारी के रूप में सेट करते हैं। यदि आप केवल एक स्ट्रिंग सेट कर सकते हैं तो आपको एक एन्कोडिंग की आवश्यकता है जो किसी बाइट को नहीं बदले। उदाहरण के लिए iso1।

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। आपकी क्या सलाह है? मुझे लगता है कि आप सही हो सकते हैं, लेकिन मुझे नहीं पता कि और क्या करना है। –

+0

अहहा, मैंने इसे समझ लिया, आप सही हैं। मैंने टूस्ट्रिंग को हटा दिया और इसे बाइनरी के रूप में आउटपुट किया, फिर ब्राउज़र पर बाइनरी भेजने के लिए cfcontent टैग की चर विशेषता का उपयोग किया। –

0

कृपया ध्यान दें कि आपके पास कोड में वाक्यविन्यास त्रुटि है: toOuptuttoOutput के बजाय।

दुर्भाग्यवश, मैं जावा विशेषज्ञ नहीं हूं और यह नहीं कह सकता कि वास्तव में क्या गलत है। लेकिन जब मैं सामग्री को Wget का उपयोग करके फ़ाइल में सहेजने का प्रयास करता हूं, इसमें ज़िप्ड बाइनरी नहीं है, लेकिन स्रोत HTML है। इसका मतलब यह हो सकता है कि gzOutput से संबंधित प्रसंस्करण सही उत्पादन नहीं करता है।

बीटीडब्ल्यू, जीजेआईपी के ब्राउज़र समर्थन की पुष्टि करना बहुत आसान है। आप देख सकते हैं Accept-Encoding हैडर, इस तरह:

<cfif FindNoCase("gzip", cgi.HTTP_ACCEPT_ENCODING)> 
    <!--- prepare the gzipped text ---> 
</cfif> 
+0

हाँ, टूऑपटट एक प्रतिलिपि पेस्ट मुद्दा था क्योंकि मैं कोड को कंडेनसिंग कर रहा था जो यहां बेहतर दिखता है, ओह। –

1

वहाँ एक कारण है कि आप वेब सर्वर (आईआईएस या अपाचे) दे अधिक मैन्युअल रूप से कर रहे है इस संभाल? उनमें से दोनों GZip एन्कोडिंग का समर्थन करते हैं, और शायद आपकी मैन्युअल प्रक्रिया से बहुत तेज़ और बेहतर काम करेंगे।

+0

मैं जीजीआईपी में अपना खुद का कैशिंग कर रहा था क्योंकि आईआईएस गतिशील रूप से जेनरेट की गई सामग्री को कैश नहीं करता है। मैं आईआईएस सिर्फ स्थिर कैच करने योग्य सामग्री gzip करने जा रहा था। –

+0

आप ehcache में gzip'd डेटा को कैश कर सकते हैं। ;) – Mark

संबंधित मुद्दे