2009-09-10 14 views
10

मेरे पास एक ऐसी स्थिति है जहां एक सर्वलेट एक PHP स्क्रिप्ट को संपीड़ित डेटा प्रदान कर रहा है। मैं जावा पक्ष पर डेटा को किसी भी समस्या को संपीड़ित नहीं करता, लेकिन PHP डिकंप्रेस करने में असमर्थ लगता है।PHP के साथ संपीड़न PHP

OutputStream o=response.getOutputStream(); 

GZIPOutputStream gz=new GZIPOutputStream(o); 
gz.write(GridCoder.encode(rs,id, perPage, page).getBytes()); 
gz.close(); 
o.close(); 

पीएचपी साइड::

$xml= gzuncompress($xml); 

कोई सही दिशा में मुझे बिंदु कृपया

यहाँ प्रासंगिक कोड के टुकड़े जावा साइड है।

+0

क्या आपको त्रुटियां मिलती हैं? क्या आप लॉग पोस्ट कर सकते हैं? – rogeriopvl

+0

सुनिश्चित करें कि आपका जावा कोड 'सामग्री-एन्कोडिंग: gzip' HTTP शीर्षलेख सेट कर रहा है। – Asaph

+0

चेतावनी: gzuncompress(): डेटा त्रुटि। मैंने यह सुनिश्चित करने के लिए डेटा को प्रतिबिंबित करने की कोशिश की है कि मुझे वास्तविक डेटा मिल रहा है और मुझे डेटा का एक ब्लॉक मिलता है जो शुरू होता है: [ सामग्री सामग्री-एन्कोडिंग gzip पर सेट है जावा साइड .. –

उत्तर

9

मैंने अभी आपका प्रश्न देखा और इसके बारे में उत्सुक था। तो मैंने अपना खुद का टेस्ट-केस बनाया। मैं इस समस्या से बाहर सभी सर्वलेट संबंधित सामान छोड़ दिया और कुछ इस तरह कोडित:

import java.io.*; 
import java.util.zip.GZIPOutputStream; 

public class GZIPTestcase { 

    public static void main(String[] args) throws Throwable { 
     GZIPOutputStream gzipOutputStream = new GZIPOutputStream(new FileOutputStream(new File("/Users/malax/foo2.gz"))); 
     PrintWriter pw = new PrintWriter(gzipOutputStream); 

     pw.println("All your base are belong to us!"); 
     pw.flush(); 
     pw.close(); 
    } 
} 

जीएनयू gunzip डेटा को विस्तारित करने में सक्षम था। तो मैं इसे PHP के साथ असम्पीडित करने की कोशिश करता हूं। यह आपको मिली त्रुटि के साथ विफल रहा। मैं आगे जांच की और पाया निम्न विधियों:

  • gzdecode()
  • gzinflate()

gzinflate काम नहीं करता है या तो, gzdecode केवल PHP6 जो मैं स्थापित havn't के साथ भेज दिया है। शायद आप इसे आजमा सकते हैं। (http://bugs.php.net/bug.php?id=22123 के अनुसार यह काम करेगा)

मुझे संदेह है कि समस्या जावा पक्ष पर है क्योंकि जीएनयू की गनज़िप डेटा को डिफ्लेट कर सकती है, इसलिए यह सही होना चाहिए। आप PHP पक्ष पर आगे की जांच करना चाहेंगे।

.NET और PHP के लिए एक वास्तविक प्रश्न है जहां मूल पोस्टर की एक ही समस्या है जैसा आपके पास है: Can PHP decompress a file compressed with the .NET GZipStream class?। PHP GZIPOutputStream के .NET समकक्ष से डेटा को डिकंप्रेस करने में सक्षम नहीं प्रतीत होता है।

क्षमा करें कि मेरे पास "समाधान" नहीं है लेकिन मैंने आपको सही दिशा में किसी भी तरह से इंगित किया होगा।

संपादित करें: http://bugs.php.net/bug.php?id=22967 ऐसा नहीं है कि gzuncompress हेडर जो GZIPOutputStream हो का उत्पादन किया जाएगा साथ GZIP डेटा को विस्तारित नहीं कर सकते लगता है: मैं PHP बगट्रैकर में एक प्रविष्टि जो समस्या बताते हैं पाया। जैसा कि बगट्रैकर एंट्री में बताया गया है, हेडर फसल करने का प्रयास करें।

6

GZIPOutputStream

के बजाय DeflaterOutputStream का उपयोग कर

पीएचपी कार्यों libzlib जो हवा निकालना लागू करता है में फोन की कोशिश करो। Gzip पूरी तरह से एक अलग जानवर है।

PHP फ़ंक्शंस नामकरण gz XXX केवल भ्रम में जोड़ता है।

+0

यह मेरे लिए काम किया। – shady

+0

अच्छा, – radhoo

3

मुझे दिशानिर्देशों के रूप में Devon_C_Miller और Malax द्वारा पोस्ट का उपयोग करके इसे ठीक करने का एक तरीका मिला।जावा के लिए

कोड:

String body = "Lorem ipsum shizzle ma nizle"; 

    URL url = new URL("http://some.url/file.php?id=" + uid); 
    URLConnection conn = url.openConnection(); 
    conn.setDoOutput(true); 
    conn.setRequestProperty("Content-encoding", "deflate"); 
    conn.setRequestProperty("Content-type", "application/octet-stream"); 

    DeflaterOutputStream dos = new DeflaterOutputStream(conn.getOutputStream()); 

    dos.write(body.getBytes()); 
    dos.flush(); 
    dos.close(); 

पीएचपी पक्ष:

$content = http_get_request_body(); 

    $uncontent = gzuncompress($content); 
+0

+1 ठीक काम करता है। मैंने कई समाधानों की कोशिश की, जिनमें 'PHP द्वारा अपरिचित हेडर को काटना' शामिल था, लेकिन केवल यह काम किया। धन्यवाद। – firebear

+0

जो स्ट्रिंग के साथ काम नहीं करता है जो संपीड़न> 300 बी के बाद है ... मुझे कोई जानकारी नहीं है, लेकिन उन मामलों में 'DeflaterOutputStream'' GZIPOutputStream' की तरह कार्य करता है (समान परिणाम देकर, PHP द्वारा अवांछनीय) –

+0

@ फ्लैश थंडर मैं नहीं कर सकता PHP 5.6.15 और जावा 8 का उपयोग करके अपनी समस्या का पुनरुत्पादन करें। मैं PHP में gzuncompress() को एक 1 लाख वर्ण लंबे यादृच्छिक पाठ UTF-8 स्ट्रिंग को जावा DeflaterOutputStream (फ़ायरबियर के उत्तर के समान) के साथ संपीड़ित करने में सक्षम हूं। यह 300 केबी संपीड़ित है, और 1 एमबी संकुचित - आपके 300 बी से कहीं अधिक है। यहां आपकी बग का परीक्षण करने के लिए उपयोग किया गया कोड है: https://gist.github.com/cordje/48a957333cd045afa3792c82334d9b06 –

0

'जावा Deflater + PHP gzuncompress' के संयोजन मेरे लिए काम किया। ग्राहक: एंड्रॉइड 4.1.1, सर्वर साइट: PHP 5.3

किसके लिए कुछ मामलों में अनुरोध निकाय के केवल हिस्सों को संपीड़ित करने के समाधान की तलाश है, उदाहरण के लिए, कुछ पैरामीटर और फ़ाइल पोस्ट करने के लिए HTTP फॉर्म का उपयोग करके, निम्नलिखित स्निपेट है जिसे मैंने एंड्रॉइड साइड में उपयोग किया था:

public static byte[] compressString(String data) throws IOException { 
     byte[] compressed = null; 
     byte[] byteData = data.getBytes(); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(byteData.length); 
     Deflater compressor = new Deflater(); 
     compressor.setLevel(Deflater.BEST_COMPRESSION); 
     compressor.setInput(byteData, 0, byteData.length); 
     compressor.finish(); 

     // Compress the data 
     final byte[] buf = new byte[1024]; 
     while (!compressor.finished()) { 
      int count = compressor.deflate(buf); 
      bos.write(buf, 0, count); 
     } 
     compressor.end(); 
     compressed = bos.toByteArray(); 
     bos.close(); 
     return compressed; 
    }