信息:GO语言实现文件上传的示例代码
(相关资料图)
目录
前言文件上传表单操作服务端操作流程实现小结前言
最近在写一个文件上传的功能,现在来进行整理总结一下go语言如何上传文件的,本文主要分享一下golang实现文件上传的流程和具体代码,供大家参考,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
文件上传
表单操作
要使表单能够上传文件,需要添加form的enctype属性enctype="multipart/form-data"
,upload.html代码如下:
上传文件
服务端操作
在服务端启动一个服务,并添加一个handlerFunc并完善相关功能即可:
package main import ( "fmt" "html/template" "io" "log" "net/http" "os" ) func main() { http.HandleFunc("/upload", Upload) if err := http.ListenAndServe("127.0.0.1:9090", nil); err != nil { log.Fatal(err) } } func Upload(w http.ResponseWriter, r *http.Request) { //判断请求方式 if r.Method == "POST" { //设置内存大小 r.ParseMultipartForm(32 << 20) //获取上传文件 file, handler, err := r.FormFile("uploadfile") if err != nil { fmt.Println(err) return } defer file.Close() fmt.Fprintf(w, "%v", handler.Header) //创建上传目录 os.Mkdir("./upload", os.ModePerm) //创建上传文件 f, err := os.Create("./upload/" + handler.Filename) if err != nil { fmt.Println(err) return } defer f.Close() io.Copy(f, file) w.WriteHeader(http.StatusCreated) io.WriteString(w, "Uploaded successfully") } else { //渲染页面 解析模板文件 tpl, _ := template.ParseFiles("./upload.html") tpl.Execute(w, nil) } }
通过http://127.0.0.1:9090/upload来测试文件上传。 截图
选择文件之后就会在当前目录下的upload文件夹中看到上传的文件了。
流程实现
通过上面的示例可以看到,处理文件上传我们需要先调用FormFile,FormFile返回提供的表单键的第一个文件, FormFile函数如下:
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) { if r.MultipartForm == multipartByReader { return nil, nil, errors.New("http: multipart handled by MultipartReader") } if r.MultipartForm == nil { err := r.ParseMultipartForm(defaultMaxMemory) if err != nil { return nil, nil, err } } if r.MultipartForm != nil && r.MultipartForm.File != nil { if fhs := r.MultipartForm.File[key]; len(fhs) > 0 { f, err := fhs[0].Open() return f, fhs[0], err } } return nil, nil, ErrMissingFile }
在FormFile方法中,会调用r.ParseMultipartForm, ParseMultipartForm函数如下:
func (r *Request) ParseMultipartForm(maxMemory int64) error { if r.MultipartForm == multipartByReader { return errors.New("http: multipart handled by MultipartReader") } if r.Form == nil { err := r.ParseForm() if err != nil { return err } } if r.MultipartForm != nil { return nil } mr, err := r.multipartReader(false) if err != nil { return err } f, err := mr.ReadForm(maxMemory) if err != nil { return err } if r.PostForm == nil { r.PostForm = make(url.Values) } for k, v := range f.Value { r.Form[k] = append(r.Form[k], v...) // r.PostForm should also be populated. See Issue 9305. r.PostForm[k] = append(r.PostForm[k], v...) } r.MultipartForm = f return nil }
里面的参数表示maxMemory,调用ParseMultipartForm之后,ParseMultipartForm将请求主体解析为multipart / form-data。解析整个请求体,将上传的文件部分存储在maxMemory大小的内存里面,如果文件大小超过了maxMemory,那么剩下的部分将存储在系统的临时文件中。我们可以通过r.FormFile获取上面的文件句柄,然后实例中使用了io.Copy来存储文件。
小结
文件上传主要有以下三步:
表单中增加enctype属性服务端调用r.ParseMultipartForm,把上传的文件存储在内存和临时文件中使用r.FormFile获取文件句柄,然后对文件进行存储等处理。到此这篇关于GO语言实现文件上传的示例代码的文章就介绍到这了,更多相关GO语言文件上传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 1联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 2亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 3现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 4如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 5AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 6转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 7充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 8好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 9名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 10亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战