2 回答
TA贡献1869条经验 获得超4个赞
使用管道将命令的输出连接到上传的输入。
这里的棘手问题是上传者在 body上查找,但管道不支持查找。为了避免这种情况,在管道周围创建了一个包装器,以对上传者隐藏 Seek 方法。
dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
// handle error
}
if err := dumpCmd.Start(); err != nil {
// handle error
}
// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
io.Reader
}{body}
uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
Body: bodyWrap,
Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
Key: aws.String("myKey"),
})
if err != nil {
log.Fatalln("Failed to upload", err)
}
if err := dumpCmd.Wait(); err != nil {
// handle error
}
log.Println("Successfully uploaded to", result.Location)
TA贡献1815条经验 获得超6个赞
您可以使用io.Copy
方法 ( godoc ),其定义如下:
功能复制
func Copy(dst Writer, src Reader)(写入int64,err错误)
将副本从 src 复制到 dst,直到在 src 上达到 EOF 或发生错误。它返回复制的字节数和复制时遇到的第一个错误(如果有)。
成功的复制返回 err == nil,而不是 err == EOF。因为 Copy 被定义为从 src 读取直到 EOF,所以它不会将读取的 EOF 视为要报告的错误。
如果 src 实现了 WriterTo 接口,则通过调用 src.WriteTo(dst) 来实现副本。否则,如果 dst 实现了 ReaderFrom 接口,则通过调用 dst.ReadFrom(src) 来实现副本。
- 2 回答
- 0 关注
- 173 浏览
添加回答
举报