咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          golang html 與 golang客戶端 上傳文件 轉載

          Posted on 2013-08-27 09:10 oathleo 閱讀(3046) 評論(0)  編輯  收藏 所屬分類: Golang

          golang html 與 golang客戶端 上傳文件

           May 30 , 2013 at 08:30 am -  263點擊 -  0 評論

          小文件上傳

           var buffer bytes.Buffer

          w := multipart.NewWriter(&buffer)
          // Write fields and files
          w.CreateFormField("input1")
          w.WriteField(
          "input1","value1")
          w.CreateFormFile(
          "file","filename.dat")

          resp,err :
          = http.Post(url,w.FormDataContentType(),&buffer)


          服務器的handler:

          func uploadHandler(w http.ResponseWriter, r 
          *http.Request){

           
          if r.URL.Path=="/upload.go" {   

                  fn,header,err:
          =r.FormFile("file")

                  defer fn.Close()

                  f,err:
          =os.Create("filenametosaveas")

                  defer f.Close()

                  io.Copy(f,fn)

              }

          }


          客戶端代碼:
          func Upload() (err error) {

              
          // Create buffer

              buf :
          = new(bytes.Buffer) // caveat IMO dont use this for large files, \

              
          // create a tmpfile and assemble your multipart from there (not tested)

              w :
          = multipart.NewWriter(buf)

              
          // Create file field

              fw, err :
          = w.CreateFormFile("file""helloworld.go"//這里的file很重要,必須和服務器端的FormFile一致

              
          if err != nil {

                  fmt.Println(
          "c")

                  
          return err

              }

              fd, err :
          = os.Open("helloworld.go")

              
          if err != nil {

                  fmt.Println(
          "d")

                  
          return err

              }

              defer fd.Close()

              
          // Write file field from file to upload

              _, err 
          = io.Copy(fw, fd)

              
          if err != nil {

                  fmt.Println(
          "e")

                  
          return err

              }

              
          // Important if you do not close the multipart writer you will not have a

              
          // terminating boundry

              w.Close()

              req, err :
          = http.NewRequest("POST","http://192.168.2.127/configure.go?portId=2", buf)

              
          if err != nil {

                  fmt.Println(
          "f")

                  
          return err

              }

              req.Header.Set(
          "Content-Type", w.FormDataContentType())

                var client http.Client

              res, err :
          = client.Do(req)

              
          if err != nil {

                  fmt.Println(
          "g")

                  
          return err

              }

              io.Copy(os.Stderr, res.Body) 
          // Replace this with Status.Code check

              fmt.Println(
          "h")

              
          return err

          }


          html上傳,原文

          package main

          import (
              
          "fmt"
              
          "io"
              
          "net/http"
              
          "log"
          )

          // 獲取大小的接口
          type Sizer interface {
              Size() int64
          }

          // hello world, the web server
          func HelloServer(w http.ResponseWriter, r *http.Request) {
              
          if "POST" == r.Method {
                  file, _, err :
          = r.FormFile("file")
                  
          if err != nil {
                      http.Error(w, err.Error(), 
          500)
                      
          return
                  }
                  defer file.Close()
                  f,err:
          =os.Create("filenametosaveas")
                  defer f.Close()
                  io.Copy(f,file)
                  fmt.Fprintf(w, 
          "上傳文件的大小為: %d", file.(Sizer).Size())
                  
          return
              }

              
          // 上傳頁面
              w.Header().Add("Content-Type""text/html")
              w.WriteHeader(
          200)
              html :
          = `
          <form enctype="multipart/form-data" action="/hello" method="POST">
              Send 
          this file: <input name="file" type="file" />
              
          <input type="submit" value="Send File" />
          </form>
          `
              io.WriteString(w, html)
          }

          func main() {
              http.HandleFunc(
          "/hello", HelloServer)
              err :
          = http.ListenAndServe(":12345", nil)
              
          if err != nil {
                  log.Fatal(
          "ListenAndServe: ", err)
              }
          }



          大文件上傳

          關鍵的不同是io.MultiReader

          package main 

          import ( 
            
          "fmt" 
            
          "net/http" 
            
          "mime/multipart" 
            
          "bytes" 
            
          "os" 
            
          "io" 
            ) 


          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("upfile", 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 
            } 
            defer fh.Close()
            
          // 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(close_string)
            
          // 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) 
          }



          主站蜘蛛池模板: 岑溪市| 大化| 梅河口市| 鹤岗市| 富宁县| 朝阳区| 建阳市| 平邑县| 临高县| 大荔县| 当阳市| 乐山市| 海宁市| 金门县| 遵化市| 稻城县| 晋州市| 谷城县| 科尔| 建湖县| 堆龙德庆县| 竹溪县| 东莞市| 门源| 左云县| 大余县| 甘孜县| 庄浪县| 闻喜县| 平湖市| 上虞市| 隆化县| 板桥市| 平陆县| 鲁甸县| 章丘市| 泰宁县| 巍山| 博白县| 龙岩市| 英吉沙县|