分享
  1. 首页
  2. 文章

go post 上传文件的例子

276815076 · · 11529 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go post 上传文件
package main
import (
 "bytes"
 "fmt"
 "io"
 "mime/multipart"
 "net/http"
 "os"
)
func postFile(filename string, target_url string) (*http.Response, error) {
 body_buf := bytes.NewBufferString("")
 body_writer := multipart.NewWriter(body_buf)
 // use the body_writer to write the Part headers to the buffer
 _, err := body_writer.CreateFormFile("userfile", filename)
 if err != nil {
 fmt.Println("error writing to buffer")
 return nil, err
 }
 // the file data will be the second part of the body
 fh, err := os.Open(filename)
 if err != nil {
 fmt.Println("error opening file")
 return nil, err
 }
 // need to know the boundary to properly close the part myself.
 boundary := body_writer.Boundary()
 //close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary)
 close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary))
 // use multi-reader to defer the reading of the file data until
 // writing to the socket buffer.
 request_reader := io.MultiReader(body_buf, fh, close_buf)
 fi, err := fh.Stat()
 if err != nil {
 fmt.Printf("Error Stating file: %s", filename)
 return nil, err
 }
 req, err := http.NewRequest("POST", target_url, request_reader)
 if err != nil {
 return nil, err
 }
 // Set headers for multipart, and Content Length
 req.Header.Add("Content-Type", "multipart/form-data; boundary="+boundary)
 req.ContentLength = fi.Size() + int64(body_buf.Len()) + int64(close_buf.Len())
 return http.DefaultClient.Do(req)
}
// sample usage
func main() {
 target_url := "http://localhost:8086/upload"
 filename := "/Users/wei/Downloads/21dian_1.9_10"
 postFile(filename, target_url)
}
参考文章 https://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/ 25

package main
import (
 "bytes"
 "fmt"
 "log"
 "mime/multipart"
 "net/http"
)
// Creates a new file upload http request with optional extra params
func newMultipartRequest(url string, params map[string]string) (*http.Request, error) {
 body := &bytes.Buffer{}
 writer := multipart.NewWriter(body)
 for key, val := range params {
 _ = writer.WriteField(key, val)
 }
 writer.Close()
 return http.NewRequest("POST", url, body)
}
func main() {
 extraParams := map[string]string{
 "title": "My Document",
 "author": "zieckey",
 "description": "A document with all the Go programming language secrets",
 }
 request, err := newMultipartRequest("http://127.0.0.1:8091/echo", extraParams)
 if err != nil {
 log.Fatal(err)
 }
 client := &http.Client{}
 resp, err := client.Do(request)
 if err != nil {
 log.Fatal(err)
 } else {
 body := &bytes.Buffer{}
 _, err := body.ReadFrom(resp.Body)
 if err != nil {
 log.Fatal(err)
 }
 resp.Body.Close()
 fmt.Println(resp.StatusCode)
 fmt.Println(resp.Header)
 fmt.Println(body)
 }
}
multipart 的例子
package main
import (
 "bytes"
 "fmt"
 "io"
 "log"
 "mime/multipart"
 "net/http"
 "os"
 "path/filepath"
)
// Creates a new file upload http request with optional extra params
func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, error) {
 file, err := os.Open(path)
 if err != nil {
 return nil, err
 }
 defer file.Close()
 body := &bytes.Buffer{}
 writer := multipart.NewWriter(body)
 part, err := writer.CreateFormFile(paramName, filepath.Base(path))
 if err != nil {
 return nil, err
 }
 _, err = io.Copy(part, file)
 for key, val := range params {
 _ = writer.WriteField(key, val)
 }
 err = writer.Close()
 if err != nil {
 return nil, err
 }
 request, err := http.NewRequest("POST", uri, body)
 request.Header.Add("Content-Type", writer.FormDataContentType())
 return request, err
}
func main() {
 path, _ := os.Getwd()
 path += "/test.pdf"
 extraParams := map[string]string{
 "title": "My Document",
 "author": "Matt Aimonetti",
 "description": "A document with all the Go programming language secrets",
 }
 request, err := newfileUploadRequest("http://localhost:8086/upload", extraParams, "userfile", "/Users/wei/Downloads/21dian_1.9_10")
 if err != nil {
 log.Fatal(err)
 }
 client := &http.Client{}
 resp, err := client.Do(request)
 if err != nil {
 log.Fatal(err)
 } else {
 body := &bytes.Buffer{}
 _, err := body.ReadFrom(resp.Body)
 if err != nil {
 log.Fatal(err)
 }
 resp.Body.Close()
 fmt.Println(resp.StatusCode)
 fmt.Println(resp.Header)
 fmt.Println(body)
 }
}

阅读原文


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:276815076

查看原文:go post 上传文件的例子

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
11529 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏