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 關注
- 209 瀏覽
添加回答
舉報