为什么在我的PHP演示中无法通过Go解压缩gzip数据,但是成功将PHP gzip数据解压到Go?我需要从Go to PHP API服务发布gzip JSON数据。
测试结果
-> | php | go --------------------- php | ok | ok go | fail | ok
PHP代码
class GzipDemo { public function gzen($data, $file){ $json_data = json_encode($data); $gz_data = gzencode($json_data,9); file_put_contents($file,$gz_data); } public function gzdn($file){ $data = file_get_contents($file); $unpacked = gzdecode($data); if ($unpacked === FALSE) { print("failed:".$file."\n"); }else{ print($file. " result Data :".$unpacked ."\n"); } } } $demo = new GzipDemo(); $file="phpgzip.txt"; $demo->gzen("data",$file); $demo->gzdn($file); $demo->gzdn("gogzip.txt");
结果是:PHP到PHP可以。转到PHP失败。
去代码
package main import ( "bytes" "compress/gzip" "encoding/json" "fmt" "io/ioutil" "os" ) func main() { gzen("data", "gogzip.txt") gden("gogzip.txt") gden("phpgzip.txt") } func gzen(data string, file string) { b, _ := json.Marshal(data) buffer := new(bytes.Buffer) w, _ := gzip.NewWriterLevel(buffer, gzip.BestCompression) defer w.Close() w.Write(b) w.Flush() ioutil.WriteFile(file, buffer.Bytes(), os.ModePerm) } func gden(file string) { b, _ := ioutil.ReadFile(file) buffer := new(bytes.Buffer) buffer.Write(b) r, _ := gzip.NewReader(buffer) defer r.close() data, _ := ioutil.ReadAll(r) fmt.Println(file, " result Data:", string(data)) }
结果是:转到好的。PHP可以了。
它适用于以下更改:
gzdecode
gzinflate
substr($data, 10)
gzencode
gzip
gz*
buffer
defer
Close()
强制性注释:您将忽略Go代码中的所有错误。这段代码看起来只是一个测试,所以我不会太在意这一点,但是您绝对希望进行适当的错误处理(将问题报告给用户或函数的调用者)。