2013-06-25 38 views
5

Tôi có thể làm một cái gì đó như dưới đây, mang lại cho tôi một lớp phản ứng, nhưng tôi không chính xác chắc chắn làm thế nào để viết io.reader vào một tập tin. Cách đơn giản nhất là gì?Cách dễ nhất để tải xuống tệp?

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

Trả lời

8

Nếu tập tin là nhỏ đủ các giải pháp đơn giản nhất là sử dụng kết hợp với ioutil.WriteFileioutil.ReadAll:

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

Nếu tập tin của bạn không phải là quá nhỏ, bạn nên tránh việc tạo ra và điền vào bytes mảng. Sau đó, bạn nên sử dụng io.Copy mà chỉ đơn giản bản sao các byte từ người đọc nhà văn:

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

Bạn phải thêm các xử lý trong cả hai trường hợp lỗi có liên quan.

+0

Tôi thực sự muốn nhấn mạnh 'ioutil.ReadAll' - hầu như không bao giờ bạn muốn làm gì trong một ứng dụng được xử lý tốt. – Dustin

+0

@Dustin Nếu tệp đủ nhỏ, tôi nghĩ nó không quan trọng. Bạn có nghĩ rằng tôi nên nhấn mạnh hơn vào thời điểm này? –

+0

Tôi không đồng ý với bạn, nhưng có lẽ phiên bản io.Copy phải là phiên bản đầu tiên. Tôi nghĩ rằng mã của bạn và lý luận là cả hai bên phải (mặc dù tôi có thể làm điều gì đó khó chịu cho chương trình của bạn). Tôi chỉ sợ rằng tôi sẽ thấy nhiều người làm điều "kéo mọi thứ vào trí nhớ". – Dustin

Các vấn đề liên quan