首页 > 其他分享 >golang实现一个简单的文件浏览下载功能代码示例

golang实现一个简单的文件浏览下载功能代码示例

时间:2023-10-07 16:00:10浏览次数:45  
标签:文件 http filepath 浏览 fmt 示例 golang file

想省事用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>")
}

标签:文件,http,filepath,浏览,fmt,示例,golang,file
From: https://www.cnblogs.com/bugutian/p/17746536.html

相关文章

  • Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《StrimziKafkaBridge(桥接)实战》的第三篇,前文咱们掌握了StrimziKafkaBridge的基本功能:基于http提供各种kafka消息的服务此刻,如果想通过http接口调......
  • 【HBuilderX】解决黑色主题中的注释颜色太浅的问题(代码示例)
    "foreground":"#a6a085"打开后,搜索Comment,修改,一个是//的颜色,一个是注释内容的颜色{ "name":"Comment", "scope":"comment", "settings":{ "foreground":"#a6a085" } }, {......
  • Css实现浏览滚动条效果
    Css实现浏览滚动条效果前言也是有大半个月没有更新文章了,大部分时间都在玩,然后就是入职的事。今天就更新一个小知识,刷抖音的时候看到的,感觉还不错。属性介绍关键属性animation-timeline:动画名称;用于控制动画的时间轴。它可以让你在一个元素上同时播放多个动画,控制它们的开......
  • 安卓开发组件开发示例
    系统原生下拉刷新<androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh_layout"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:android="http://sc......
  • 微软写了份GPT-4V说明书:166页详细讲解,提示词demo示例全都有
    克雷西萧箫发自凹非寺量子位公众号QbitAI多模态王炸大模型GPT-4V,166页“说明书”重磅发布!而且还是微软团队出品。什么样的论文,能写出166页?不仅详细测评了GPT-4V在十大任务上的表现,从基础的图像识别、到复杂的逻辑推理都有展示;还传授了一整套......
  • 基于goravel的CMS,企业官网通用golang后台管理系统
    2023年9月11日10:47:00仓库地址:https://gitee.com/open-php/zx-goravel-websiteCMS,企业官网通用PHP后台管理系统框架介绍GoravelSCUI后端开发组件go1.20Goravel1.13数据库sql(使用最新日期文件)goravel\doc\sql_bakmysql8.0前端开发组件scui1.6.9nodev14.21.......
  • 有关于Mysql的简单问题及示例(增删改查 一对一 多对多 左外连接 右外链接)
    Mysql1、请自行设计表并针对该表练习最基本的增删改查且写出示例代码建立表格class其中有属性nameidgenderinterest表格建立完成向表中插入数据插入数据完成尝试删除表中id=101的数据删除数据成功尝试修改表中id为102的数据修改成功2、请问什么是一对多?请自......
  • R语言代码示例
    以下是一个更为复杂的R语言代码示例,展示了一些复杂的数据处理、可视化和模型构建技巧:#设定随机数种子set.seed(123)#生成模拟数据n<-1000x1<-rnorm(n)x2<-rnorm(n)y<-2*x1+3*x2+rnorm(n)#数据预处理df<-data.frame(x1,x2,y)df$x_sum<-df$x1+df$x......
  • C 语言代码示例
    以下是一个较为复杂的C语言代码示例,它演示了如何使用链表数据结构实现一个简单的图(Graph)数据结构,并实现图的深度优先搜索(DFS)算法:#include<stdio.h>#include<stdlib.h>structNode{intvertex;structNode*next;};structGraph{intnumVertices;st......
  • Ubuntu 安装谷歌浏览器报错解决:Errors were encountered while processing
    Ubuntu安装谷歌浏览器报错解决parallels@ubuntu-linux-22-04-02-desktop:~/snap/firefox/common/Downloads$sudodpkg-igoogle-chrome-stable_current_amd64.deb[sudo]passwordforparallels:dpkg:errorprocessingarchivegoogle-chrome-stable_current_amd64.deb(......