I am trying to build a service that takes user input of file from POST
request and then iterates the CSV and passes it into my database. I am having problem to pass the file and read it. Below are my codes.
Endpoint.go
type CSVRequest struct {
File io.Reader
}
func MakeCSVEndpoint(svc Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(CSVRequest)
data, err := svc.ReadCSV(req.File)
if err != nil {
return GetErrorResponse{err}, nil
}
return CreateProductResponse{data}, nil
}
}
transport.go
func decodeCreateProductsCSV(_ context.Context, r *http.Request) (interface{}, error) {
file, _, err := r.FormFile("file")
return CSVRequest{File: file}, nil
}
so how can I pass the csv file to the service.go and then read and iterate the csv file and get the values of the csv file.
Here is a basic function that can do the parsing from a POST request. The result is a two-dimensional array of strings, the first dimension being the rows and the second dimension being the values in a row. It uses the golang's own "encoding/csv" package. Go playground example available here.
func ReadCSVFromHttpRequest(req *http.Request) ([][]string, error) {
// parse POST body as csv
reader := csv.NewReader(req.Body)
var results [][]string
for {
// read one row from csv
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
return nil, err
}
// add record to result set
results = append(results, record)
}
return results, nil
}