如何用Go编写CLI实现CSV文件上传并代理至后端?
如何在Go CLI中实现CSV文件表单上传至后端服务
我希望开发一个基于Go的CLI程序,实现CSV文件上传并将其作为payload代理至后端服务。当前已完成以下内容:
- 通过Cobra框架实现了获取CSV文件路径和SourceId的upload命令;
- 编写了将payload序列化为JSON并发送POST请求至后端的代理逻辑;
- 后端已实现处理表单中CSV文件的逻辑,通过
request.FormFile获取文件。现有疑问:需要补充哪些代码才能让CLI上传的CSV文件被后端正确处理?获取文件路径后该如何操作?
核心修正与实现步骤
由于后端是通过request.FormFile处理表单格式的文件上传,你之前的JSON序列化逻辑不符合要求,需要改为构建multipart/form-data格式的请求。具体操作如下:
1. 打开本地CSV文件
拿到命令行传入的文件路径后,先打开文件并处理错误:
csvPath := cmd.Flag("csv-path").Value.String() sourceId := cmd.Flag("source-id").Value.String() // 打开目标CSV文件 file, err := os.Open(csvPath) if err != nil { log.Fatalf("无法打开CSV文件: %v", err) } defer file.Close()
2. 构建multipart表单
使用mime/multipart包创建表单,将CSV文件和SourceId作为表单字段添加:
// 创建缓冲区存储表单内容 body := &bytes.Buffer{} writer := multipart.NewWriter(body) // 添加CSV文件字段(字段名必须和后端FormFile的参数一致,比如后端用`file`,这里就写`file`) fileField, err := writer.CreateFormFile("file", filepath.Base(csvPath)) if err != nil { log.Fatalf("创建表单文件字段失败: %v", err) } // 将文件内容复制到表单字段中 _, err = io.Copy(fileField, file) if err != nil { log.Fatalf("复制文件内容失败: %v", err) } // 添加SourceId表单字段 err = writer.WriteField("source_id", sourceId) if err != nil { log.Fatalf("写入SourceId字段失败: %v", err) } // 结束表单构建 err = writer.Close() if err != nil { log.Fatalf("关闭表单写入器失败: %v", err) }
3. 发送POST请求至后端
设置正确的请求头(必须包含multipart的boundary),然后发送请求:
// 创建POST请求 req, err := http.NewRequest("POST", "你的后端接口URL", body) if err != nil { log.Fatalf("创建请求失败: %v", err) } // 设置Content-Type,使用writer自动生成的带boundary的类型 req.Header.Set("Content-Type", writer.FormDataContentType()) // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Fatalf("发送请求失败: %v", err) } defer resp.Body.Close() // 读取并打印后端响应 respBody, err := io.ReadAll(resp.Body) if err != nil { log.Fatalf("读取响应失败: %v", err) } fmt.Printf("后端响应: %s\n", respBody)
4. 整合到Cobra命令
将上述逻辑替换你原来的JSON序列化请求代码,放到upload命令的Run函数中即可。
关键注意事项
- 表单字段名必须和后端
request.FormFile("字段名")的参数完全匹配,否则后端无法识别文件; - 禁止使用JSON序列化请求体,必须用
multipart.NewWriter构建表单格式; - 所有打开的文件、响应体都要通过
defer关闭,避免资源泄漏; - 每一步都要处理错误,保证CLI的健壮性。
内容的提问来源于stack exchange,提问作者carlcaroline
相关产品推荐
相关产品推荐

