golang 下载和上传,处理多文件上传
ggaaooppeennngg · 2014-10-04 19:26:06 · 16819 次点击 · 预计阅读时间 3 分钟 · 大约1分钟之前 开始浏览
package main
import (
"net/http"
"os"
"io"
"strconv"
)
func main() {
f, err := os.OpenFile("K:/file.mp3", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
stat, err := f.Stat() //获取文件状态
if err != nil { panic(err) } //把文件指针指到文件末,当然你说为何不直接用 O_APPEND 模式打开,没错是可以。我这里只是试验。
url := "http://127.0.0.1:3000/assets/37-02.mp3"
req,_ := http.NewRequest("GET",url,nil);
req.Header.Set("Range", "bytes=" + strconv.FormatInt(stat.Size(),10) + "-")
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
written, err := io.Copy(f, resp.Body)
if err != nil { panic(err) }
println("written: ", written)
}
服务器的话就更简单了,这个是忽略url中的/assets/,直接找到对应的raido目录
var staticHandler http.Handler // 静态文件处理 func StaticServer(w http.ResponseWriter, req *http.Request) { fmt.Println("path:" + req.URL.Path) staticHandler.ServeHTTP(w, req) } func init(){ staticHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("radio"))) } func main() {//已经有静态文件了 http.HandleFunc("/assets/",StaticServer) err := http.ListenAndServe(":3000", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
处理多文件上传,如果是以数组的形式post,后面那个[]不要忘记,因为golang保留了那个中括号.
如果form里面变量都是唯一的,直接用parseformvalue,和parsefile就可以,因为返回的都是单个变量而不是一个数组了,省的另外操作数组。
if r.Method == "POST" { r.ParseMultipartForm(8 << 20) title := r.ParseFormValue["title"] fhs := r.MultipartForm.File["radio[]"] options := r.MultipartForm.Value["options[]"] answers := r.MultipartForm.Value["answers[]"] l := len(options) optionDirs := make([]string, l) t := time.Now() for i := 0; i < l; i++ { file, err := fhs[i].Open() if err != nil { panic(err) } filename := fhs[i].Filename f, err := os.OpenFile("statics/"+filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { panic(err) } defer f.Close() io.Copy(f, file) optionDirs = append(optionDirs, filename) } db.InsertHomework(&db.HomeWork{ Title: title, Options: options, OptionDirs: optionDirs, Answers: answers, Time: t, }) sess := session.GlobalSessionManager.SessionStart(w, r) if sess != nil { sess.Set("flash", true) } defer sess.SessionRelease() http.Redirect(w, r, "/homeworks", http.StatusFound) }
要用multiform.File就可以获得那个文件的描述头,然后调用fsh[o].Open就能获得文件对象。
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)