golang 发送http请求上传文件
时间: 2024-09-20 21:14:09 浏览: 47
在 Go 语言中发送 HTTP 请求上传文件通常涉及两个关键步骤:创建 HTTP 客户端,然后构建包含文件数据的multipart/form-data 部分。这里是一个简单的示例:
```go
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"net/http"
)
// 文件上传函数
func uploadFile(url string, file multipart.File, filename string) error {
// 创建一个HTTP POST请求
req, err := http.NewRequest("POST", url, nil)
if err != nil {
return err
}
// 设置Content-Type为multipart/form-data
req.Header.Set("Content-Type", "multipart/form-data")
// 将文件添加到请求体
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("file", filename) // "file"是表单字段名
if err != nil {
return err
}
_, err = io.Copy(part, file)
if err != nil {
return err
}
writer.Close()
// 添加文件结束标记
req.Body = ioutil.NopCloser(writer)
// 发起HTTP请求并处理响应
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 检查请求是否成功
if resp.StatusCode != http.StatusOK {
log.Printf("Error uploading file: %s\n", resp.Status)
return fmt.Errorf("upload failed with status code: %d", resp.StatusCode)
}
fmt.Println("File uploaded successfully")
return nil
}
// 示例:读取本地文件并上传
func main() {
file, err := os.Open("path/to/local/file.txt") // 替换为实际文件路径
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 上传到这个URL(替换为实际地址)
url := "https://example.com/upload"
err = uploadFile(url, file, "local_file.txt") // 使用文件名作为字段名
if err != nil {
log.Fatal(err)
}
}
```
阅读全文