经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Golang实现http文件上传小功能的案例
来源:jb51  时间:2021/5/7 9:35:46  对本文有异议

看代码吧~

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net/http"
  6. "os"
  7. )
  8. func main() {
  9. http.HandleFunc("/", index)
  10. http.HandleFunc("/upload", upload)
  11. http.ListenAndServe(":1789", nil)
  12. }
  13. func upload(w http.ResponseWriter, r *http.Request) {
  14. r.ParseMultipartForm(32 << 20)
  15. file, handler, err := r.FormFile("uploadfile")
  16. if err != nil {
  17. fmt.Println(err)
  18. return
  19. }
  20. defer file.Close()
  21. f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
  22. if err != nil {
  23. fmt.Println(err)
  24. return
  25. }
  26. defer f.Close()
  27. io.Copy(f, file)
  28. fmt.Fprintln(w, "upload ok!")
  29. }
  30. func index(w http.ResponseWriter, r *http.Request) {
  31. w.Write([]byte(tpl))
  32. }
  33. const tpl = `<html>
  34. <head>
  35. <title>上传文件</title>
  36. </head>
  37. <body>
  38. <form enctype="multipart/form-data" action="/upload" method="post">
  39. <input type="file" name="uploadfile" />
  40. <input type="hidden" name="token" value="{...{.}...}"/>
  41. <input type="submit" value="upload" />
  42. </form>
  43. </body>
  44. </html>`

补充:Golang 调用http 文件上传接口 进行上传文件

远程服务器有一个文件上传接口,文件用于保存到服务器本地,用go如何调用此接口将文件上传至服务器?

首先,文件上传请求方 与 接收方 要协调工作(解析等工作)

接收方:

  1. func UploadFileToLocal(c echo.Context) error {
  2. r := c.Request() //无论用的什么路由,原理是要从request获取数据
  3. t := echotools.NewEchoTools(c)
  4. reader, err := r.MultipartReader() //request 获得文件 reader
  5. if err != nil {
  6. return t.BadRequest(err.Error())
  7. }
  8. if reader == nil {
  9. return t.BadRequest(`未接受到文件`)
  10. }
  11. //遍历操作 获得的
  12. for {
  13. part, err := reader.NextPart()
  14. if err == io.EOF {
  15. break
  16. }
  17. fmt.Printf("FileName=[%s],FormName[%s]\n",part.FileName(),part.FormName())
  18. if part.FileName() == "" {
  19. data, _ := ioutil.ReadAll(part)
  20. fmt.Printf("FormData=[%s]\n", string(data))
  21. continue
  22. } else {
  23. //创建一个空文件
  24. dst, er:= os.Create("static/uploadfiles/" + part.FileName())
  25. if er != nil {
  26. return t.BadRequest(err.Error())
  27. }
  28. defer dst.Close()
  29. //将获取到的文件复制 给 创建的文件
  30. _,err := io.Copy(dst, part)
  31. if err != nil {
  32. return t.BadRequest(err.Error())
  33. }
  34. }
  35. }
  36. return t.OK(`OK`)
  37. }

请求方:

  1. func SendFile(c echo.Context) error{
  2. t := echotools.NewEchoTools(c)
  3. r := c.Request()
  4. file, header, err := r.FormFile("file") // 获得客户端传来的 文件 file
  5. if err != nil {
  6. return t.BadRequest("上传错误:" + err.Error())
  7. }
  8. bodyBuffer := &bytes.Buffer{}
  9. bodyWriter := multipart.NewWriter(bodyBuffer)
  10. fileWriter, _ := bodyWriter.CreateFormFile("files", header.Filename)
  11. io.Copy(fileWriter, file) //将 客户端文件 复制给 用于传输的 fileWriter
  12. contentType := bodyWriter.FormDataContentType() //contentType
  13. bodyWriter.Close()
  14. ip := config.Opts.UploadServerAddr //配置
  15. resp, _ := http.Post("http://"+ip+"/uploadToLocal/"+header.Filename, contentType, bodyBuffer)
  16. defer resp.Body.Close()
  17. resp_body, _ := ioutil.ReadAll(resp.Body)
  18. if resp.Status == `200 OK` {
  19. return t.OK(string(resp_body))
  20. }else {
  21. return t.BadRequest(string(resp_body))
  22. }
  23. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。如有错误或未考虑完全的地方,望不吝赐教。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号