要实现一个基于Go语言的HTTP文件服务器,可以按照以下步骤进行:
- 导入所需的包:
import (
"fmt"
"io"
"net/http"
"os"
)
- 实现文件上传功能:
func uploadFile(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(32 << 20)
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
io.Copy(f, file)
fmt.Fprintf(w, "文件上传成功")
}
- 实现文件下载和查询功能:
func downloadFile(w http.ResponseWriter, r *http.Request) {
fileName := r.URL.Query().Get("filename")
file, err := os.Open(fileName)
if err != nil {
http.Error(w, "文件不存在", http.StatusNotFound)
return
}
defer file.Close()
fileInfo, _ := file.Stat()
w.Header().Set("Content-Disposition", "attachment; filename="+fileName)
w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
w.Header().Set("Content-Length", fmt.Sprint(fileInfo.Size()))
http.ServeContent(w, r, "", fileInfo.ModTime(), file)
}
func queryFile(w http.ResponseWriter, r *http.Request) {
fileName := r.URL.Query().Get("filename")
fileInfo, err := os.Stat(fileName)
if os.IsNotExist(err) {
http.Error(w,"文件不存在", http.StatusNotFound)
return
}
fmt.Fprintf(w,"文件存在,大小为:%d bytes, 修改时间为:%s", fileInfo.Size(), fileInfo.ModTime())
}
- 设置路由和启动服务器:
func main() {
http.HandleFunc("/upload", uploadFile)
http.HandleFunc("/download", downloadFile)
http.HandleFunc("/query", queryFile)
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println(err)
}
}
这样就实现了一个基本的HTTP文件服务器,通过上传、下载和查询接口可以进行相应的操作。注意要根据实际需求对代码进行适当修改和完善,例如添加权限验证、路径处理等。
内容由零声教学AI助手提供,问题来源于学员提问




