使用Go的bufio.Writer、gzip.Writer内存压缩上传S3的换行问题
问题:Go内存生成压缩文件上传S3后换行符不被Linux识别
原实现代码
数据结构与序列化
type Data struct { field_1 int field_2 string } func (d *Data) Serialize() []byte { return []byte( fmt.Sprintf(`%d;%s `, d.field_1, d.field_2) ) }
内存生成压缩文件
var datas []*Data // 假设已填充数据 buffer := &bytes.Buffer{} compressor := gzip.NewWriter(buffer) writer := bufio.NewWriter(compressor) for _, data := range datas { writer.Write(data.Serialize()) } writer.Flush() compressor.Close()
S3上传代码
key := "file.gz" payload := bytes.NewReader(buffer.Bytes()) upload := &s3.PutObjectInput{ Body: payload, Bucket: aws.String(bucket), Key: aws.String(key), }
问题现象
上述方案运行高效,但生成的压缩文件在Linux下虽被识别为文本文件,却无法识别手动添加的\n换行符。不确定是操作系统差异、文件后缀(如是否该用file.txt.gz/file.csv.gz)、文件头字节还是创建方式导致的问题,需要找到逐行创建符合标准的内存文件([]byte或io.ReadSeeker形式)并上传S3的正确方式。
解决方法(更新)
改用fmt.Sprintln包裹字符串后问题解决,修改后的序列化方法如下:
func (d *Data) Serialize() []byte { return []byte( fmt.Sprintln(fmt.Sprintf(`%d;%s`, d.field_1, d.field_2)) ) }
查看fmt.Sprintln的实现可知它会追加\n字符,推测手动添加的换行符和该方法的实现存在细微差异。
内容的提问来源于stack exchange,提问作者t.ry
相关产品推荐
相关产品推荐

