Gibt es eine Möglichkeit, eine große Datei mit Go herunterzuladen, die den Inhalt direkt in einer Datei speichert, anstatt sie im Speicher zu speichern, bevor sie in eine Datei geschrieben wird? Da die Datei so groß ist, wird der gesamte Speicher belegt, wenn sie im Speicher gespeichert wird, bevor sie in eine Datei geschrieben wird.Wie kann ich eine große Datei mit Go effizient herunterladen?
Antwort
Ich nehme an, Sie über http bedeuten herunterladen (Fehlerprüfungen der Kürze halber weggelassen):
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)
den Körper des http.Response ein Reader ist, so dass Sie alle Funktionen nutzen zu können, die einen Reader nehmen, zu, z.B lesen Sie ein Stück nach dem anderen und nicht auf einmal. In diesem speziellen Fall erledigt io.Copy()
die Gruntwork für Sie.
Hier ist ein Beispiel. https://github.com/thbar/golang-playground/blob/master/download-files.go
Auch ich gebe Ihnen einige Codes könnten Ihnen helfen.
Code:
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)
}
}
}
Dieses Beispiel liest den gesamten Inhalt mit dem 'ioutil.ReadAll()' in den Speicher. Das ist in Ordnung, solange Sie mit kleinen Dateien zu tun haben. – eduncan911
@ eduncan911, aber es ist nicht gut für diese Frage, die explizit über große Dateien spricht und nicht alles in den Speicher saugen will. –
Genau richtig, deshalb habe ich das so kommentiert - damit andere das auch nicht für große Dateien verwenden können. – eduncan911
Eine beschreibende Version von Steve M Antwort.
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
}
Die Antwort ausgewählt oben io.Copy
verwendet, ist genau das, was Sie brauchen, aber wenn Sie in zusätzlichen Funktionen wie die Wiederaufnahme von abgebrochenen Downloads, automatische Benennung von Dateien, Prüfsummenvalidierung oder die Überwachung der Fortschritte mehrerer Downloads interessiert sind, Check-out die grab Paket.
- 1. Große Datei herunterladen mit Grails
- 2. Große Datei herunterladen
- 3. Wie kann ich eine Datei mit Lebenslauf-Unterstützung herunterladen?
- 4. Browser zwingen eine große Datei herunterladen
- 5. Wie kann ich eine CSV-Datei in Perl effizient parsen?
- 6. Wie kann ich eine große Datei mit dem iPhone SDK herunterladen und Speicherprobleme vermeiden?
- 7. effizient eine große Datei in eine Karte zu lesen
- 8. Wie kann ich eine XML-Datei mit C# herunterladen?
- 9. Wie kann ich eine Datei mit window.fetch herunterladen?
- 10. Wie kann ich nur meine PHP-Datei eine Datei herunterladen?
- 11. Codova, kann ich eine Datei herunterladen (root)/Ordner herunterladen?
- 12. Wie kann ich eine große rdd effizient mit einer sehr großen rdd in funken verbinden?
- 13. Wie kann ich eine HttpResponse in eine Datei herunterladen?
- 14. Wie kann ich eine Perl DBM-Datei effizient leeren?
- 15. Wie große Datei herunterladen mit PHP (geringe Speicherauslastung)
- 16. Wie kann ich eine Datei in php erstellen und herunterladen
- 17. Wie kann ich eine große Datei über CSVParser verarbeiten?
- 18. Wie man eine Datei rückwärts lesen effizient
- 19. Wie kann man eine Datei vom Server mit smartgwt herunterladen?
- 20. wie eine Datei mit Broadcast-Empfänger herunterladen?
- 21. wie eine Zip-Datei mit eckigen herunterladen
- 22. Streaming herunterladen große Datei mit Python-Anfragen unterbrechen
- 23. Wie kann ich eine Griffon-Anwendung mit easyb effizient testen?
- 24. Wie versorge ich eine große Datei mit Pylonen?
- 25. Django eine Datei herunterladen
- 26. Wie kann ich Dateien herunterladen
- 27. Einzelne statische HTML-Datei: Wie kann ich sie effizient bedienen?
- 28. Wie kann ich eine große Exponentialfunktion berechnen?
- 29. Flask Eine Datei herunterladen
- 30. Wie kann ich große Daten effizient mit einer großen Anzahl von Variablen anpassen
Beachten Sie, dass "io.Copy" 32kb (maximal) aus der Eingabe liest und sie an die Ausgabe schreibt und dann wiederholt. Also mach dir keine Sorgen um die Erinnerung. –