Golang中如何解决从exec.Command输出获取文件名后无法使用ServeFile的问题

Golang中如何解决从exec.Command输出获取文件名后无法使用ServeFile的问题 我有一个shell脚本,它会创建一个随机文件并输出该文件的位置。

TEMP=$RANDOM.txt
touch $TEMP
echo $(pwd)/$TEMP

在同一目录下,有一个Go程序用于提供生成的文件供下载。serveFileexec.Command("bash", "foo.sh").Output()获取文件名(foo是脚本的名称)。问题是服务器返回的是404页面未找到而不是文件。为什么会这样?

package main
 
 import (
     "log"
     "net/http"
     "os/exec"
 )
 
 func handler(w http.ResponseWriter, r *http.Request) {
     out, err := exec.Command("bash", "foo.sh").Output()
     if err != nil {
         http.Error(w, err.Error(), http.StatusInternalServerError)
         log.Println(err)
         return
     }
     log.Println(string(out))
     http.ServeFile(w, r, string(out))
 }
 
 func main() {
     http.HandleFunc("/random", handler)
     http.ListenAndServe(":8080", nil)
 }

更多关于Golang中如何解决从exec.Command输出获取文件名后无法使用ServeFile的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我明白了。echo 会在字符串末尾添加 \n

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

更多关于Golang中如何解决从exec.Command输出获取文件名后无法使用ServeFile的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出现在从exec.Command获取的输出包含换行符或其他不可见字符,导致http.ServeFile无法正确解析文件路径。exec.Command().Output()返回的字节切片包含脚本的标准输出,包括末尾的换行符(\n),这会使文件路径无效。

解决方案是清理输出,去除空白字符。使用strings.TrimSpace可以移除开头和结尾的空白字符,包括换行符。

以下是修正后的代码示例:

package main

import (
    "log"
    "net/http"
    "os/exec"
    "strings"
)

func handler(w http.ResponseWriter, r *http.Request) {
    out, err := exec.Command("bash", "foo.sh").Output()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        log.Println(err)
        return
    }
    filename := strings.TrimSpace(string(out))
    log.Println("Serving file:", filename)
    http.ServeFile(w, r, filename)
}

func main() {
    http.HandleFunc("/random", handler)
    http.ListenAndServe(":8080", nil)
}

在这个修正版本中,strings.TrimSpace处理输出,确保文件路径是干净的。现在,当访问http://localhost:8080/random时,服务器应该能正确提供文件下载,而不是返回404错误。

回到顶部