随笔 - 313  文章 - 29  评论 - 32  阅读 - 124万 

想省事用Claude(一个 依托chatgpt 的 AI)生成一段 golang 的文件浏览下载示例,结果给生成的代码大概是这样的(省去了无关部分,主要部分如下):

    http.HandleFunc("/*", downloadFile)
    http.HandleFunc("/", showFileList)

测试之后,结果发现每次都会走到“/”下去,无论如何都不会走到下载上。通配符“/*”竟然不生效,把两个函数换位置也无效。
拿这个结果再问 Claude,他给出了建议,但依然无法解决,最终还是自己取文件明判断,然后再跳转到处理函数才解决了此问题。

/*这个示例在`./files`目录下存放文件,主页`/`路径展示文件列表。点击文件链接会下载该文件。
可以根据需要调整文件存储路径,添加更多功能等。*/

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
    "path/filepath"
)

// 指定文件存储目录
var fileDir string

func main() {
    fileDir = "./files"
    http.HandleFunc("/", dispatcher)
    http.ListenAndServe(":8080", nil)
}

func dispatcher(w http.ResponseWriter, r *http.Request) {
    // 获取文件名
    file := filepath.Base(r.URL.Path)
    fmt.Println(file)
    if len(file) > 0 && file != "/" {
        downloadFile(w, r)
    }else {
        showFileList(w, r)
    }
}

func downloadFile(w http.ResponseWriter, r *http.Request) {
    //下载文件逻辑
    fmt.Println("run to /*")
    file := r.URL.Path[1:]
    f, _ := os.Open(fileDir + "/" + file)
    defer f.Close()
    
    w.Header().Set("Content-Type", "application/octet-stream")
    w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", file))
    
    io.Copy(w, f)
}

func showFileList(w http.ResponseWriter, r *http.Request) {
    //展示文件列表逻辑  
    fmt.Println("run to /")
    files, _ := filepath.Glob(fileDir + "/*")
    
    fmt.Fprint(w, "<h1>文件列表:</h1><ul>")
    for _, f := range files {
        fmt.Fprintf(w, `<li><a href="/%s">%s</a></li>`, filepath.Base(f), filepath.Base(f)) 
    }
    fmt.Fprint(w, "</ul>")
}
posted on   步孤天  阅读(403)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示