老铁门还是相同的人物,相同的地点,不同的时间,直接上代码,啊哈哈哈
package main
import (
"fmt"
"io"
"net/http"
"os"
)
/*
文件上传处理
*/
func uploadFile(w http.ResponseWriter, r *http.Request) {
// Parse the multipart form data
err := r.ParseMultipartForm(10 << 20) // 最大10MB文件大小
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 获取上传的文件
file, handler, err := r.FormFile("file")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer file.Close()
// 创建一个新文件
f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer f.Close()
// 将上传的文件内容拷贝到新文件中
_, err = io.Copy(f, file)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "文件上传成功!")
}
/*
文件下载
*/
func downloadFile(w http.ResponseWriter, r *http.Request) {
// 获取URL中的参数(Get请求)
queryParams := r.URL.Query()
// 获取特定的值(拿到需要下载的文件名称)
filePath := queryParams.Get("filename")
if filePath == "" {
// 直接返回响应
fmt.Fprintf(w, "%s", "文件名不能为空!")
return
}
// 和 OS 交互
file, err := os.Open(filePath)
if err != nil {
fmt.Println(err)
fmt.Fprintf(w, "Sorry:%s", "找不到对应的文件!")
return
}
defer file.Close()
// 设置响应头,告诉浏览器该文件需要下载而不是直接展示
w.Header().Set("Content-Disposition", "attachment; filename="+filePath)
// 将文件内容写入响应体
_, err = io.Copy(w, file)
if err != nil {
fmt.Println(err)
return
}
}
func main() {
// 上传 (参数说明:接口地址和调用的是那个函数)
http.HandleFunc("/upload", uploadFile)
// 下载
http.HandleFunc("/download", downloadFile)
http.ListenAndServe(":8080", nil)
}