我正在Go中从S3下载一个zip文件,如下所示:
buff := &aws.WriteAtBuffer{}
downloader := s3manager.NewDownloader(session.New(config))
_, err := downloader.Download(buff, &input)
if err != nil {
log.Println(err)
return err
}
data := buff.Bytes()
我将“数据”发送到使用Python3编写的客户端,并且需要将此字节数组转换回zip文件并将其放入指定的目录中。我已经尝试过了:
file_bytes = msg_obj["Params"]
try:
zf = zipfile.ZipFile(file_bytes, "r")
for fileinfo in zf.infolist():
print(zf.read(fileinfo).decode('ascii'))
except: print("Err:", sys.exc_info()[0])
但是我得到这个错误:
OSError:[Errno 36]文件名太长”
我只想“重建” zip文件并将其保存到目录中。
答案 0 :(得分:1)
读取io.BytesIO,ZipFile类的第一个参数是文件名或文件对象,而不是Zip内容。
如果您想在不创建实际文件的情况下读取内存中的ZipFile,则需要使用Java naming conventions包装file_bytes。
答案 1 :(得分:0)
我想出了办法。在运行中,您将需要对它进行base64编码(作为字符串)。
buff := &aws.WriteAtBuffer{}
downloader := s3manager.NewDownloader(session.New(config))
_, err := downloader.Download(buff, &input)
if err != nil {
log.Println(err)
return err
}
data := b64.StdEncoding.EncodeToString(buff.Bytes())
然后在python中就这么简单(其中“ file_bytes”是base64编码的字符串):
d = base64.b64decode(file_bytes)
f = open('home/update_file', 'wb')
f.write(d)
f.close()
还有bam,您有一个重新组合的zip文件。