Golang下载的图片无法打开怎么办
Golang下载的图片无法打开怎么办 我在Google Drive上公开分享了这个图片文件:Cashew SC pic - Abdulhadi Khalifah.jpeg - Google Drive
我想将它下载到我的电脑上,因此编写了以下代码:
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
// image link, open at browser
// https://drive.google.com/open?id=1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU
url := "https://drive.google.com/download?id=1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU"
// or
// url := "https://googledrive.com/host/1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU"
fileName := "file.jpeg"
fmt.Println("Downloading file...")
output, err := os.Create(fileName)
defer output.Close()
response, err := http.Get(url)
if err != nil {
fmt.Println("Error while downloading", url, "-", err)
return
}
defer response.Body.Close()
n, err := io.Copy(output, response.Body)
fmt.Println(n, "bytes downloaded")
}
文件已经下载了,但当我尝试打开它时,收到了这个错误:

更多关于Golang下载的图片无法打开怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
你检查过响应的 StatusCode 吗?
例如,如果我在浏览器中输入 https://drive.google.com/download?id=1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU,会得到一个“未找到”页面。
更多关于Golang下载的图片无法打开怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您的指正,错误在于URL,正确的代码应该是:
image := "https://drive.google.com/open?id=1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU"
id := image[33:]
url := "https://docs.google.com/uc?export=download&id=" + id
问题在于你使用了错误的Google Drive下载URL。Google Drive的公开分享链接需要特殊处理才能直接下载文件内容。
正确的做法是使用Google Drive的导出链接格式,或者解析分享链接获取直接下载URL。以下是两种解决方案:
方案1:使用Google Drive的导出链接(推荐)
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
// 使用Google Drive的导出链接格式
fileID := "1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU"
url := fmt.Sprintf("https://drive.google.com/uc?export=download&id=%s", fileID)
fileName := "file.jpeg"
fmt.Println("Downloading file...")
// 创建HTTP客户端
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
// 设置User-Agent头
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
// 发送请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error while downloading:", err)
return
}
defer resp.Body.Close()
// 创建文件
output, err := os.Create(fileName)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer output.Close()
// 复制内容
n, err := io.Copy(output, resp.Body)
if err != nil {
fmt.Println("Error copying content:", err)
return
}
fmt.Printf("%d bytes downloaded successfully\n", n)
}
方案2:处理大文件下载(带确认页面)
对于大文件,Google Drive可能会显示确认页面,需要额外处理:
package main
import (
"fmt"
"io"
"net/http"
"net/http/cookiejar"
"os"
"strings"
)
func main() {
fileID := "1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU"
url := fmt.Sprintf("https://drive.google.com/uc?export=download&id=%s", fileID)
fileName := "file.jpeg"
// 创建带cookie的客户端
jar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: jar,
}
// 第一次请求,处理可能的确认页面
resp, err := client.Get(url)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
// 检查是否需要确认
bodyBytes, _ := io.ReadAll(resp.Body)
body := string(bodyBytes)
if strings.Contains(body, "confirm=") {
// 提取确认token
start := strings.Index(body, "confirm=")
end := strings.Index(body[start:], "&")
if end == -1 {
end = len(body) - start
}
token := body[start+8 : start+end]
// 使用确认token重新请求
downloadURL := fmt.Sprintf("%s&confirm=%s", url, token)
resp, err = client.Get(downloadURL)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
} else {
// 重新读取响应体
resp.Body = io.NopCloser(strings.NewReader(body))
}
// 保存文件
output, err := os.Create(fileName)
if err != nil {
fmt.Println("Error:", err)
return
}
defer output.Close()
n, err := io.Copy(output, resp.Body)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("%d bytes downloaded successfully\n", n)
}
方案3:使用第三方库(简化操作)
安装go-getter库:
go get github.com/hashicorp/go-getter
package main
import (
"fmt"
"github.com/hashicorp/go-getter"
)
func main() {
fileID := "1WPWH9zkQ25CASuh3uXs7T3i5PvsEfIKU"
url := fmt.Sprintf("https://drive.google.com/uc?export=download&id=%s", fileID)
fileName := "file.jpeg"
client := &getter.Client{
Src: url,
Dst: fileName,
Mode: getter.ClientModeFile,
}
if err := client.Get(); err != nil {
fmt.Println("Download failed:", err)
return
}
fmt.Println("File downloaded successfully")
}
关键点:
- 使用正确的URL格式:
https://drive.google.com/uc?export=download&id=FILE_ID - 设置合适的User-Agent头
- 处理Google Drive的确认页面(对于大文件)
- 使用专门的下载库可以简化处理流程
使用方案1的代码应该能解决你的问题,下载的图片文件应该可以正常打开。

