提问人:carlcaroline 提问时间:11/10/2023 最后编辑:egleasecarlcaroline 更新时间:11/12/2023 访问量:45
如何使用 Go 使用 CLI 上传任何文件?
how can I upload any file with CLI with go?
问:
我想制作一个可以上传 CSV 文件的 CLI 程序,以便以后可以使用上传的文件作为有效负载代理到后端程序? 场景如下:
- 获取将要上传的 CSV 文件的路径目录,并通过 CLI 将其用作有效负载
var payload = GenericPart{SourceId string, GenericFile string}
var uploadGenericPartFileCmd = &cobra.Command{
Use: "upload",
Short: "Upload generic part file",
RunE: func(cmd *cobra.Command, args []string) error {
err := c.Client.UploadGenericPartFileCmd(payload.SourceId, payload.GenericFile)
if err != nil {
return err
}
return nil
},
}
uploadGenericPartFileCmd.Flags().StringVar(&payload.SourceId, "id-source", "", "Source ID")
uploadGenericPartFileCmd.Flags().StringVar(&payload.GenericFile, "generic-file", "", "Generic File")`
- 发出新请求并将其代理到预定义的后端
payload := &GenericPart{
sourceId,
genericFile,
}
requestBody, err := json.Marshal(payload)
if err != nil {
return fmt.Errorf("cannot make json, got %w", err)
}
req, _ := http.NewRequest("POST", fmt.Sprintf("%s/api/v1/upload", c.Url), bytes.NewReader(requestBody))
resp, err := c.httpClient.Do(req)
if err != nil {
return fmt.Errorf("cannot make request to api service, got %w", err)
}
defer resp.Body.Close()
- 后端处理类型仍为文件的有效负载(我已经做了一个后端来处理上传的文件)
source := request.FormValue("source_id")
f, h, err := request.FormFile("data")
if err != nil {
c.httpError(writer, err)
return
}
defer f.Close()
fileType, _, err := mime.ParseMediaType(h.Header.Get("Content-Type"))
if err != nil || fileType != "text/csv" {
c.httpError(writer, ec.NewError(ErrCodeCsvParse, Errs[ErrCodeCsvParse], fmt.Errorf("Content-Type `%s` is not valid", fileType)))
return
}
reader := csv.NewReader(f)
谁能告诉我应该添加什么,以便我可以使用作为请求上传到后端的 CSV 文件?
而且我仍然对如何上传文件并将其用作有效负载感到困惑?获取路径目录后该怎么办?
非常感谢!
答:
0赞
ikamornikau
11/12/2023
#1
您只需使用 function 读取文件并获取进一步请求有效负载所需的数据。然后添加请求头并发送请求。os.ReadFile()
[]byte
Content-Type: text/csv
假设您按以下方式运行代码:$ go run main.go your_file.csv http://example.com/v1/upload
然后,您的代码可能如下所示:
data, err := os.ReadFile(os.Args[1])
...
req, err := http.NewRequest("POST", os.Args[2], bytes.NewReader(data))
...
res, err := httpClient.Do(req)
PS 我看不出有必要在这里使用第三方软件包。
评论