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")
}

文件已经下载了,但当我尝试打开它时,收到了这个错误: enter image description here


更多关于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")
}

关键点:

  1. 使用正确的URL格式:https://drive.google.com/uc?export=download&id=FILE_ID
  2. 设置合适的User-Agent头
  3. 处理Google Drive的确认页面(对于大文件)
  4. 使用专门的下载库可以简化处理流程

使用方案1的代码应该能解决你的问题,下载的图片文件应该可以正常打开。

回到顶部