gcompress_gzip.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. package gcompress
  7. import (
  8. "bytes"
  9. "compress/gzip"
  10. "io"
  11. "github.com/gogf/gf/v2/errors/gerror"
  12. "github.com/gogf/gf/v2/os/gfile"
  13. )
  14. // Gzip compresses `data` using gzip algorithm.
  15. // The optional parameter `level` specifies the compression level from
  16. // 1 to 9 which means from none to the best compression.
  17. //
  18. // Note that it returns error if given `level` is invalid.
  19. func Gzip(data []byte, level ...int) ([]byte, error) {
  20. var (
  21. writer *gzip.Writer
  22. buf bytes.Buffer
  23. err error
  24. )
  25. if len(level) > 0 {
  26. writer, err = gzip.NewWriterLevel(&buf, level[0])
  27. if err != nil {
  28. err = gerror.Wrapf(err, `gzip.NewWriterLevel failed for level "%d"`, level[0])
  29. return nil, err
  30. }
  31. } else {
  32. writer = gzip.NewWriter(&buf)
  33. }
  34. if _, err = writer.Write(data); err != nil {
  35. err = gerror.Wrap(err, `writer.Write failed`)
  36. return nil, err
  37. }
  38. if err = writer.Close(); err != nil {
  39. err = gerror.Wrap(err, `writer.Close failed`)
  40. return nil, err
  41. }
  42. return buf.Bytes(), nil
  43. }
  44. // GzipFile compresses the file `src` to `dst` using gzip algorithm.
  45. func GzipFile(srcFilePath, dstFilePath string, level ...int) (err error) {
  46. dstFile, err := gfile.Create(dstFilePath)
  47. if err != nil {
  48. return err
  49. }
  50. defer dstFile.Close()
  51. return GzipPathWriter(srcFilePath, dstFile, level...)
  52. }
  53. // GzipPathWriter compresses `filePath` to `writer` using gzip compressing algorithm.
  54. //
  55. // Note that the parameter `path` can be either a directory or a file.
  56. func GzipPathWriter(filePath string, writer io.Writer, level ...int) error {
  57. var (
  58. gzipWriter *gzip.Writer
  59. err error
  60. )
  61. srcFile, err := gfile.Open(filePath)
  62. if err != nil {
  63. return err
  64. }
  65. defer srcFile.Close()
  66. if len(level) > 0 {
  67. gzipWriter, err = gzip.NewWriterLevel(writer, level[0])
  68. if err != nil {
  69. return gerror.Wrap(err, `gzip.NewWriterLevel failed`)
  70. }
  71. } else {
  72. gzipWriter = gzip.NewWriter(writer)
  73. }
  74. defer gzipWriter.Close()
  75. if _, err = io.Copy(gzipWriter, srcFile); err != nil {
  76. err = gerror.Wrap(err, `io.Copy failed`)
  77. return err
  78. }
  79. return nil
  80. }
  81. // UnGzip decompresses `data` with gzip algorithm.
  82. func UnGzip(data []byte) ([]byte, error) {
  83. var buf bytes.Buffer
  84. reader, err := gzip.NewReader(bytes.NewReader(data))
  85. if err != nil {
  86. err = gerror.Wrap(err, `gzip.NewReader failed`)
  87. return nil, err
  88. }
  89. if _, err = io.Copy(&buf, reader); err != nil {
  90. err = gerror.Wrap(err, `io.Copy failed`)
  91. return nil, err
  92. }
  93. if err = reader.Close(); err != nil {
  94. err = gerror.Wrap(err, `reader.Close failed`)
  95. return buf.Bytes(), err
  96. }
  97. return buf.Bytes(), nil
  98. }
  99. // UnGzipFile decompresses srcFilePath `src` to `dst` using gzip algorithm.
  100. func UnGzipFile(srcFilePath, dstFilePath string) error {
  101. srcFile, err := gfile.Open(srcFilePath)
  102. if err != nil {
  103. return err
  104. }
  105. defer srcFile.Close()
  106. dstFile, err := gfile.Create(dstFilePath)
  107. if err != nil {
  108. return err
  109. }
  110. defer dstFile.Close()
  111. reader, err := gzip.NewReader(srcFile)
  112. if err != nil {
  113. err = gerror.Wrap(err, `gzip.NewReader failed`)
  114. return err
  115. }
  116. defer reader.Close()
  117. if _, err = io.Copy(dstFile, reader); err != nil {
  118. err = gerror.Wrap(err, `io.Copy failed`)
  119. return err
  120. }
  121. return nil
  122. }