Добавить необработанный ответ Goreq.body в файл
Привет я хотел бы добавить загруженный файл сырой ответ на файл. Предполагается, что я пытаюсь загрузить файл размером 1 ГБ, и процесс загрузки будет выполнен в несколько запросов. Скажем, 100 МБ за запрос. Теперь это все 10 частей должны быть помещены в один файл для чтения. Я не знаю, как этого добиться. Я использую GOREQ для запроса этого ресурса, а необработанные данные представлены в формате Goreq.body. Ниже приведен мой пример кода
newFile := "./newfile.gz"
out, err := os.Create(newFile)
defer out.close()
if err != nil {
fmt.Println("Failed to download file")
return
}
for i := 0; i < 10; i++ {
// This will return the items in part of 100mb/part.
// GetRawDataFromEbay returns a goreq.body(raw) as its response
response, _ = GetRawDataFromEbay(10485760)
out.Write(response) // This does not work
}
Я знаю, что Write принимает [] байт в качестве параметра. Но как я могу добавить необработанные данные goreq.body в файл?
2 ответа
Хорошо, нашел ответ, кажется, что мне не нужно делать что-то причудливое. Я просто должен использовать io.copy и все. Просто для справки для других, имеющих такую же проблему ниже, мой код
newFile := "./newfile.gz"
out, err := os.Create(newFile)
defer out.close()
if err != nil {
fmt.Println("Failed to download file")
return
}
for i := 0; i < 10; i++ {
// This will return the items in part of 100mb/part.
// GetRawDataFromEbay returns a goreq.body(raw) as its response
response, _ = GetRawDataFromEbay(10485760)
io.Copy(file, response) // Where file is an instance of *os.File
}
Таким образом, в основном, если ответ Goreq.body находится по частям, когда вы копируете другой ответ (частично) в тот же файл, он автоматически добавит его
Вы можете использовать fileObj.WriteAt(content, offSet) для добавления содержимого в файл.
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("test")
f, err := os.Create("/Users/sakthi-2528/test/test213123.txt")
if err != nil {
fmt.Println(err)
return
}
n, err := f.WriteAt([]byte("Foo"), 0)
if err != nil {
fmt.Println(err)
return
}
off := n
n, err = f.WriteAt([]byte("Bar"), int64(off))
if err != nil {
fmt.Println(err)
return
}
off += n
_, err = f.WriteAt([]byte("FooBar"), int64(off))
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
}