<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    咖啡伴侶

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

    golang html 與 golang客戶端 上傳文件 轉(zhuǎn)載

    Posted on 2013-08-27 09:10 oathleo 閱讀(3044) 評論(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) 
    }



    主站蜘蛛池模板: 国产精品亚洲综合五月天| 国产精品免费视频观看拍拍| 国产午夜免费秋霞影院| 国产精品永久免费| 亚洲欧洲中文日产| 亚洲AⅤ视频一区二区三区 | 免费一级做a爰片久久毛片潮| 亚洲欧洲日产国码无码网站| 国产又大又长又粗又硬的免费视频 | tom影院亚洲国产一区二区| 免费人成在线观看播放国产| 久久精品国产免费| 亚洲精品无码av片| 亚洲高清在线观看| 免费一级做a爰片性色毛片| 久久成人国产精品免费软件| 免费大片av手机看片| 亚洲黄色网址大全| 亚洲精品国产高清嫩草影院| 最近免费中文字幕mv电影| 日韩a毛片免费观看| 亚洲喷奶水中文字幕电影| 91人成网站色www免费下载| 精品亚洲成A人在线观看青青| 香蕉蕉亚亚洲aav综合| 国产成人免费网站在线观看| 69av免费视频| 国产色无码精品视频免费| 激情无码亚洲一区二区三区 | 亚洲国产成人久久综合| 亚洲三级电影网址| 成人亚洲性情网站WWW在线观看 | 33333在线亚洲| 水蜜桃亚洲一二三四在线| 亚洲精品黄色视频在线观看免费资源| 97在线线免费观看视频在线观看 | 成人a免费α片在线视频网站| 99精品免费视品| jzzjzz免费观看大片免费| 亚洲精品美女久久7777777| 亚洲国产精品综合久久网各|