2013-06-25 28 views
5

Posso fare qualcosa di simile in basso, che mi dà una classe di risposta, ma non sono esattamente sicuro di come scrivere il file io.reader in un file. Qual è il modo più diretto?Il modo più semplice per scaricare un file?

http.Get("https://www.domain.com/some.jpg") 

risposta

8

Se il file è abbastanza piccolo la soluzione più semplice è quello di utilizzare in combinazione con ioutil.WriteFileioutil.ReadAll:

resp, err := http.Get("your url") 
bytes, err := ioutil.ReadAll(resp.Body) 
err = ioutil.WriteFile(filename, bytes, 0666) 

Se il file non è così piccolo, è meglio evitare di creare e riempire il bytes array. Poi si dovrebbe usare io.Copy che copia semplicemente i byte dal lettore allo scrittore:

resp, err := http.Get("your url") 
f, err := os.Create(filename) 
defer f.Close() 
_, err := io.Copy(f, resp.Body) 

è necessario aggiungere il relativo movimentazione in entrambi i casi di errore.

+0

Vorrei davvero togliere importanza a 'ioutil.ReadAll' - non è quasi mai quello che vuoi fare in un'applicazione ben educata. – Dustin

+0

@Dustin Se il file è abbastanza piccolo, penso che non importi. Pensi che dovrei porre più enfasi su questo punto? –

+0

Non sono d'accordo con te, ma forse la versione io.Copy dovrebbe essere la prima. Penso che il tuo codice e il tuo ragionamento abbiano entrambi ragione (anche se potrei fare qualcosa di sgradevole al tuo programma). Ho solo paura che vedrò più persone che fanno la cosa "tira tutto in memoria". – Dustin

Problemi correlati