对Go来说很新(我正在做的第一个简单项目).
问题:如何从URL获取图像然后将其保存到计算机中?
这是我到目前为止所拥有的:
package main
import (
"fmt"
"net/http"
"image"
"io/ioutil"
)
func main() {
url := "http://i.imgur.com/m1UIjW1.jpg"
// don't worry about errors
response, _ := http.Get(url);
defer response.Body.Close()
m, _, err := image.Decode(response.Body)
error := ioutil.WriteFile("/images/asdf.jpg", m, 0644)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到了 cannot use m (type image.Image) as type []byte in function argument
我假设我必须将image.Image(变量m
)转换为未定义的字节数量?这是正确的方法吗?
Not*_*fer 37
无需解码文件.只需将响应正文复制到您打开的文件即可.以下是修改示例中的交易:
response.Body
是一个数据流,并实现了Reader
接口 - 这意味着您可以按顺序调用Read
它,就好像它是一个打开的文件.Writer
接口.这是相反的 - 它是你可以调用的流Write
.io.Copy
"补丁"读取器和写入器,使用读取器流并将其内容写入Writer. 这是关于go - 隐式接口的我最喜欢的事情之一.您不必声明您正在实现接口,您只需实现它以在某些上下文中使用.这允许混合和匹配不需要知道与其交互的其他代码的代码.
包主
import (
"fmt"
"io"
"log"
"net/http"
"os"
)
func main() {
url := "http://i.imgur.com/m1UIjW1.jpg"
// don't worry about errors
response, e := http.Get(url)
if e != nil {
log.Fatal(e)
}
defer response.Body.Close()
//open a file for writing
file, err := os.Create("/tmp/asdf.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Use io.Copy to just dump the response body to the file. This supports huge files
_, err = io.Copy(file, response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("Success!")
}
Run Code Online (Sandbox Code Playgroud)
package main
import (
"io"
"net/http"
"os"
"fmt"
)
func main() {
img, _ := os.Create("image.jpg")
defer img.Close()
resp, _ := http.Get("http://i.imgur.com/Dz2r9lk.jpg")
defer resp.Body.Close()
b, _ := io.Copy(img, resp.Body)
fmt.Println("File size: ", b)
}
Run Code Online (Sandbox Code Playgroud)