Golang实现HTTP客户端并支持Excel文件上传

Golang实现HTTP客户端并支持Excel文件上传 我有以下结构体

type Upload_sgpa_f struct {
	Finyear      int                   `binding:"required"`
	Boardlevel   string                `binding:"required"`
	Useraadhaar  int                   `binding:"required"`
	Excel        *multipart.FileHeader `form:"excel" binding:"required"`
}
var upload_sgpa_f Upload_sgpa_f
upload_sgpa_f.Finyear = nFinyear
upload_sgpa_f.Useraadhaar = nUseraadhaar
upload_sgpa_f.Boardlevel = sBorad

如何将文件赋值给这个属性 upload_sgpa_f.Excel

我尝试了以下代码

// 打开文件句柄
fh, err := os.Open(fileInfo.Name())
if err != nil {
	fmt.Println("error opening file")
	return err
}
defer func(fh *os.File) {
	err := fh.Close()
	if err != nil {
		return
	}
}(fh)

来将文件赋值给 Excel 属性。但这不起作用。


更多关于Golang实现HTTP客户端并支持Excel文件上传的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

已解决

更多关于Golang实现HTTP客户端并支持Excel文件上传的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我想使用Go语言的HTTP客户端(POST方法)上传Excel文件。

无论如何,这看起来是一个最近更新的库,可以在本地读写Excel文件,无需依赖外部服务:https://github.com/qax-os/excelize

我需要Golang的HTTP客户端请求。

我们已经通过HTML和Angular实现了。

现在我需要从Golang客户端实现。

我需要Go Gin服务器和客户端应用程序的示例代码。

用于上传Excel或任何文件。

使用Go Gin处理服务器的POST请求。 使用Go客户端通过http包发送HTTP POST请求。

这意味着您可能正在使用微软的 Office 365 REST 或 GraphQL API?如果是这样,提供一个指向 API 端点的指针可以告诉我们更多信息。

或者,您可能想使用一个已经封装了上述 API 端点的 Go 库?如果是这样,需要提供该库的链接以便了解更多信息。

据我所知,标准库中不提供 Excel 支持,因此你需要提供更多关于你正在使用哪个库的上下文信息。

顺便说一下:你知道在这个论坛上可以使用 Markdown 格式吗?你可以让你的代码在这里看起来更美观一些。在 https://markdown-it.github.io/ 上试试看。

这是一个使用 Gin 框架的示例:

Gin Web Framework

单文件上传

参考 issue #774 和详细的示例代码。 不应信任 file.Filename。请参阅 MDN 上的 Content-Disposition 和 #1693。 文件名始终是可选的,应用程序不应盲目使用:应去除路径信息,并且…

这是一个使用 Echo 框架的示例(在我看来它比 Gin 更有趣):

echo.labstack.com

文件上传 | Echo

文件上传配方

但这两个示例都假设你的客户端是 Web 浏览器,这使得它更加复杂,因为你必须处理表单等。

如果你最终只是想发送二进制文件,我相当确定我可以拼凑一个简单的 HTTP 服务器和客户端,中间不涉及任何 HTML 内容?你甚至可以使用原始的 UDP 或 TCP 套接字,如果客户端和服务器都在本地网络上,或者所有端口都开放的话,但 HTTP 对于在公共互联网上避免防火墙等会更安全。

在Golang中,multipart.FileHeader 类型通常是通过HTTP请求的multipart表单解析自动填充的,而不是通过手动打开文件创建的。要正确赋值,你需要使用 multipart.FormFile 或类似的方法来获取文件头。

以下是两种常见的方法:

方法1:通过HTTP请求解析(推荐)

如果你的代码在HTTP处理函数中,应该这样处理:

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    // 解析multipart表单,限制上传大小(例如10MB)
    err := r.ParseMultipartForm(10 << 20) // 10 MB
    if err != nil {
        http.Error(w, "无法解析表单", http.StatusBadRequest)
        return
    }
    
    // 获取文件
    file, header, err := r.FormFile("excel")
    if err != nil {
        http.Error(w, "无法获取文件", http.StatusBadRequest)
        return
    }
    defer file.Close()
    
    // 创建结构体实例并赋值
    upload_sgpa_f := Upload_sgpa_f{
        Finyear:     nFinyear,
        Boardlevel:  sBorad,
        Useraadhaar: nUseraadhaar,
        Excel:       header, // 这里直接使用从请求中获取的FileHeader
    }
    
    // 使用upload_sgpa_f进行后续处理...
}

方法2:手动创建multipart.FileHeader(不常见)

如果你确实需要手动创建(比如测试场景),可以这样做:

import (
    "mime/multipart"
    "os"
)

func createFileHeader(filePath string) (*multipart.FileHeader, error) {
    // 打开文件
    file, err := os.Open(filePath)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    
    // 获取文件信息
    fileInfo, err := file.Stat()
    if err != nil {
        return nil, err
    }
    
    // 创建multipart.FileHeader
    header := &multipart.FileHeader{
        Filename: fileInfo.Name(),
        Size:     fileInfo.Size(),
        // 注意:这里缺少了Header字段,实际使用中可能不完整
    }
    
    return header, nil
}

// 使用示例
header, err := createFileHeader("path/to/excel.xlsx")
if err != nil {
    // 处理错误
}
upload_sgpa_f.Excel = header

重要说明:

  1. multipart.FileHeader 通常包含以下字段

    • Filename:文件名
    • Size:文件大小
    • Header:MIME头部信息
    • 内部的文件句柄
  2. 你的原始代码问题: 你尝试用 os.Open 打开文件,但这返回的是 *os.File,而不是 *multipart.FileHeader。这两个类型不兼容。

  3. 实际使用场景: 在真实的HTTP上传场景中,你应该使用第一种方法,让Go的 net/http 包自动处理multipart表单解析。

如果你需要进一步处理文件内容,可以通过 header.Open() 方法获取文件读取器:

// 在获取FileHeader后
file, err := upload_sgpa_f.Excel.Open()
if err != nil {
    // 处理错误
}
defer file.Close()

// 读取文件内容
content, err := io.ReadAll(file)
if err != nil {
    // 处理错误
}
// 处理Excel文件内容...
回到顶部