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
我想使用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 框架的示例:
单文件上传
参考 issue #774 和详细的示例代码。
不应信任 file.Filename。请参阅 MDN 上的 Content-Disposition 和 #1693。
文件名始终是可选的,应用程序不应盲目使用:应去除路径信息,并且…
这是一个使用 Echo 框架的示例(在我看来它比 Gin 更有趣):
文件上传 | 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
重要说明:
-
multipart.FileHeader通常包含以下字段:Filename:文件名Size:文件大小Header:MIME头部信息- 内部的文件句柄
-
你的原始代码问题: 你尝试用
os.Open打开文件,但这返回的是*os.File,而不是*multipart.FileHeader。这两个类型不兼容。 -
实际使用场景: 在真实的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文件内容...

