উত্তর:
আমি ধরে নেব যে আপনি HTTP- র মাধ্যমে ডাউনলোড বোঝাতে চাইছেন (ব্রেভিটির জন্য ত্রুটি চেক বাদ দেওয়া হয়েছে):
import ("net/http"; "io"; "os")
...
out, err := os.Create("output.txt")
defer out.Close()
...
resp, err := http.Get("http://example.com/")
defer resp.Body.Close()
...
n, err := io.Copy(out, resp.Body)
Http.Response এর দেহটি একটি পাঠক, সুতরাং আপনি কোনও পাঠককে গ্রহণযোগ্য কোনও ফাংশন ব্যবহার করতে পারেন, যেমন, একবারে সব চেয়ে একবারে কিছু অংশ পড়ুন। এই নির্দিষ্ট ক্ষেত্রে, io.Copy()
আপনার জন্য উদ্বেগ কাজ করে।
client := http.Client{Timeout: 10 * time.Second,} client.Get("http://example.com/")
স্টিভ এম এর উত্তরের আরও বর্ণনামূলক সংস্করণ।
import (
"os"
"net/http"
"io"
)
func downloadFile(filepath string, url string) (err error) {
// Create the file
out, err := os.Create(filepath)
if err != nil {
return err
}
defer out.Close()
// Get the data
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Check server response
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("bad status: %s", resp.Status)
}
// Writer the body to file
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}
উপরে বর্ণিত উত্তরটি io.Copy
হ'ল আপনার প্রয়োজনটি হ'ল তবে আপনি যদি ভাঙা ডাউনলোডগুলি পুনরায় শুরু করা, অটো-নামকরণ ফাইলগুলি, চেকসামের যাচাইকরণ বা একাধিক ডাউনলোডের অগ্রগতি পর্যবেক্ষণের মতো অতিরিক্ত বৈশিষ্ট্যে আগ্রহী হন তবে দখল প্যাকেজটি চেকআউট করুন ।
এখানে একটি নমুনা। https://github.com/thbar/golang-playground/blob/master/download-files.go
এছাড়াও আমি আপনাকে কিছু কোড দিতে সাহায্য করতে পারে।
কোড:
func HTTPDownload(uri string) ([]byte, error) {
fmt.Printf("HTTPDownload From: %s.\n", uri)
res, err := http.Get(uri)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
d, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ReadFile: Size of download: %d\n", len(d))
return d, err
}
func WriteFile(dst string, d []byte) error {
fmt.Printf("WriteFile: Size of download: %d\n", len(d))
err := ioutil.WriteFile(dst, d, 0444)
if err != nil {
log.Fatal(err)
}
return err
}
func DownloadToFile(uri string, dst string) {
fmt.Printf("DownloadToFile From: %s.\n", uri)
if d, err := HTTPDownload(uri); err == nil {
fmt.Printf("downloaded %s.\n", uri)
if WriteFile(dst, d) == nil {
fmt.Printf("saved %s as %s\n", uri, dst)
}
}
}
ioutil.ReadAll()
। এটি ঠিক আছে, যতক্ষণ আপনি ক্ষুদ্র ফাইল নিয়ে কাজ করছেন।
io.Copy
ইনপুট থেকে 32kb (সর্বাধিক) পড়ে এবং সেগুলিকে আউটপুট লিখে দেয়, তারপরে পুনরাবৃত্তি করে। সুতরাং স্মৃতি নিয়ে চিন্তা করবেন না।