Sending a CSV File as a Response to an HTTP Request Using Gin

laurentiu.raducu

Sending a CSV File as a Response to an HTTP Request Using Gin

3 minutes read

Recently, I was asked on reddit the following question:

Hi, I noticed you posted on r/golang and I thought maybe you could help me with something. Using Gin, do you know how to send a csv file as a response to a http get request?

Why not answering through a blog post?

Gin is a popular web framework for building web applications in Go. It provides a powerful set of tools for routing, middleware, and rendering responses. In this tutorial, I’ll show you how to use Gin to send a CSV file as a response to an HTTP GET request.

Sending a CSV file as a response can be useful in many scenarios. For example, you may want to provide a way for users to download data from your application in CSV format. Here’s how to do it with Gin:

Step 1: Define a handler function

The first step is to define a handler function that reads the contents of the CSV file and sends it as a response. Here’s an example handler function:

func downloadCSV(c *gin.Context) {
    // Set the content type to CSV
    c.Writer.Header().Set("Content-Type", "text/csv")

    // Set the content disposition header to force download
    c.Writer.Header().Set("Content-Disposition", "attachment;filename=example.csv")

    // Read the contents of the CSV file
    fileContents, err := ioutil.ReadFile("path/to/your/file.csv")
    if err != nil {
        c.String(http.StatusInternalServerError, "Error reading CSV file")
        return
    }

    // Write the contents of the CSV file to the response
    c.Writer.Write(fileContents)
}

In this example, the downloadCSV function takes a gin.Context object as an argument. The function first sets the content type to text/csv using the Set method of the Header object on the response writer. It then sets the content disposition header to attachment;filename=example.csv using the same method. This header tells the browser to force the file to download rather than display it in the browser window.

The function then reads the contents of the CSV file using the ReadFile function from the io/ioutil package. If there’s an error reading the file, the function sends an HTTP 500 error response with the message “Error reading CSV file”. If the file is read successfully, the function writes the contents of the file to the response using the Write method of the response writer.

Step 2: Define a route

The next step is to define a route that maps the handler function to a specific HTTP endpoint. Here’s an example route:

func main() {
    r := gin.Default()

    r.GET("/download", downloadCSV)

    r.Run(":8080")
}

In this example, the GET method is used to define the route. When a GET request is made to the /download endpoint, the downloadCSV function is called to generate the response.

Step 3: Replace the file path

In the downloadCSV function, replace "path/to/your/file.csv" with the actual path to your CSV file. Make sure that the file is readable by the user running your Go application.

Step 4: Run the application

Finally, run the application and make a GET request to the /download endpoint. The browser should prompt you to save the CSV file to your local machine.


In this blog, I showed you how to use Gin to send a CSV file as a response to an HTTP GET request. You can use this technique to provide a way for users to download data from your application in CSV format. Gin provides a powerful set of tools for building web applications in Go, and I hope this post has been helpful in getting you started.