Добавить необработанный ответ 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()
}
Другие вопросы по тегам