Golang在VPS上返回文件损坏问题

Golang在VPS上返回文件损坏问题 以下是我的代码:

func main() {
    fmt.Println("hello world")
}

它应该创建一个文件,用数值填充一列并返回该文件。

如果在本地测试,Excel文件是正常的 但如果部署到VPS上,返回的文件就是损坏的 有什么想法可能出问题吗? 这是我用于POST请求的curl命令: curl -X POST http://localhost:8080 --output file.xlsx

谢谢

9 回复

顺便问一下,你的VPS是在Linux上运行的吗?

更多关于Golang在VPS上返回文件损坏问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,Ubuntu 16.04.4 LTS。

最终,我遇到的唯一问题是在我的两台VPS上都使用了Go 1.6版本。
将其更新到1.10后,问题得到解决。感谢。

func main() {
    fmt.Println("hello world")
}

有趣。 以下是我用来连接我的VPS的curl命令: curl -X POST http://167.99.247.248:8080 --output file.xlsx

您的代码在我这里运行正常。我已经将编译后的二进制文件部署到我的VPS上,您可以通过以下链接访问:https://www.lhorn.de/file.xlsx

能否分享您的VPS链接?

由于我想将数据发布到JSON文件中,并在Excel文件中获取输出

哇,这真奇怪——我会仔细研究一下

实际上我甚至还没有构建它——目前只是在我的VPS上运行 go run main.go

func main() {
    fmt.Println("hello world")
}

为什么使用 POST 请求?你的代码同样适用于 GET 请求。

我觉得奇怪的是,你的部署和我的部署返回的文件类型不同。我在 VPS 上部署你的原始代码生成的文件被识别为 Microsoft OOXML,但你的部署返回的文件却被识别为 Microsoft Excel 2007+

你是如何构建在 VPS 上运行的二进制文件的?是在本地构建后复制到 VPS,还是直接在 VPS 上用 Go 构建的?

根据您提供的信息,问题很可能出现在代码逻辑与预期功能不匹配上。您展示的代码只是打印"hello world",但您描述的功能是生成Excel文件。以下是可能导致文件损坏的几个常见原因及相应的解决方案:

问题分析

  1. 代码功能不完整 - 当前代码没有文件生成逻辑
  2. 缺少Excel文件处理库
  3. HTTP响应设置不正确
  4. 文件编码或内容类型问题

解决方案代码示例

package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/xuri/excelize/v2"
)

func generateExcelHandler(w http.ResponseWriter, r *http.Request) {
    // 创建新的Excel文件
    f := excelize.NewFile()
    
    // 设置工作表名称
    index := f.NewSheet("Sheet1")
    
    // 填充数据到A列
    for i := 1; i <= 10; i++ {
        cell := fmt.Sprintf("A%d", i)
        f.SetCellValue("Sheet1", cell, i)
    }
    
    // 设置活动工作表
    f.SetActiveSheet(index)
    
    // 设置HTTP响应头
    w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    w.Header().Set("Content-Disposition", "attachment; filename=file.xlsx")
    w.Header().Set("Content-Transfer-Encoding", "binary")
    
    // 将Excel文件写入HTTP响应
    if err := f.Write(w); err != nil {
        http.Error(w, "无法生成Excel文件", http.StatusInternalServerError)
        return
    }
}

func main() {
    http.HandleFunc("/", generateExcelHandler)
    fmt.Println("服务器启动在 :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

依赖安装

go mod init yourapp
go get github.com/xuri/excelize/v2

测试命令

curl -X POST http://localhost:8080 --output file.xlsx

关键点:

  • 使用正确的Content-Type头:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • 确保Excelize库正确安装
  • 检查VPS上的Go版本和依赖是否与本地一致
  • 验证VPS磁盘空间和权限

如果问题仍然存在,检查VPS上的Go环境配置和文件系统权限。

回到顶部