如何使用 Go 使用 CLI 上传任何文件?

how can I upload any file with CLI with go?

提问人:carlcaroline 提问时间:11/10/2023 最后编辑:egleasecarlcaroline 更新时间:11/12/2023 访问量:45

问:

我想制作一个可以上传 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 文件?
而且我仍然对如何上传文件并将其用作有效负载感到困惑?获取路径目录后该怎么办?

非常感谢!

go proxy 命令行界面 后端 httprequest

评论

0赞 icza 11/10/2023
你做过任何研究吗?如果是这样,并且您有特定问题,请编辑您的问题以包含更多详细信息并缩小您的问题范围。
0赞 carlcaroline 11/10/2023
我编辑了它,请检查谁知道你可以帮忙

答:

0赞 ikamornikau 11/12/2023 #1

您只需使用 function 读取文件并获取进一步请求有效负载所需的数据。然后添加请求头并发送请求。os.ReadFile()[]byteContent-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 我看不出有必要在这里使用第三方软件包。