将 CSVExport 函数传递给处理程序 Gin

Passing an CSVExport function to a handler Gin

我已经为我的待办事项列表应用程序创建了 CSV 导出功能。该函数正在运行,处理程序正在返回一个写入的文件,但我在 Gin 框架的控制台中收到一个奇怪的恐慌:

http: wrote more than the declared Content-Length

这很重要吗?我该如何解决这种恐慌。

这是我的功能:

func (r *Repository) CSVExport() (*os.File, error) {
    tasks, err := r.getAllTasks()
    if err != nil {
        return nil, err
    }

    file, err := os.Create("tasks.csv")
    if err != nil {
        return nil, err
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    var taskNameList []string
    for _, task := range tasks {
        taskNameList = append(taskNameList, task.Text)
    }

    err = writer.Write(taskNameList)
    if err != nil {
        return nil, err
    }

    return file, nil
}

这是处理程序:

func CSVExport(data model.ListOperations) gin.HandlerFunc {
    return func(c *gin.Context) {
        tasks, err := data.CSVExport()
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid Task"})
        }
        c.FileAttachment("./tasks.csv", "tasks.csv")
        c.Writer.Header().Set("attachment", "filename=tasks.csv")
        c.JSON(200, tasks)
    }
}

您的代码有一些错误:

  • 您需要 return 出错
  • 你不能 return JSON 在 return 使用 fileAttachment 加载你的文件后(它已经做了这些事情)
func CSVExport(data model.ListOperations) gin.HandlerFunc {
    return func(c *gin.Context) {
        tasks, err := data.CSVExport()
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid Task"})
            return //stop it on error
        }
        c.FileAttachment("./tasks.csv", "tasks.csv")
        c.Writer.Header().Set("attachment", "filename=tasks.csv")
        //c.JSON(200, tasks) not need the fileAttachement func do it
    }
}