在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ golang做上傳文件服務(wù)器文件處理問題

golang做上傳文件服務(wù)器文件處理問題

1.使用golang 做web服務(wù)器
2.客戶端使用http put的形式,上傳文件到此web服務(wù)器
3.假如上傳的文件很大,服務(wù)器可否支持,比如上傳到服務(wù)器100k大小后就,存一個chunk文件,然后釋放那部分內(nèi)存,以此類推(覺得類似于管道)
4.目前我知道 http.Request.Body 可以獲取上傳之后的文件具體內(nèi)容,并且它是一個 io.ReadCloser類型
5.再問一下http.Request.Body是服務(wù)器這邊全部接收到了內(nèi)容之后才能讀取到嗎?
6.http.Request.ContentLength是如何得到的,是服務(wù)器這邊全部接收到了內(nèi)容之后算的?還是客戶端那邊帶過來的
請大家看一下應(yīng)該如何實現(xiàn)這個功能
我的實驗代碼也貼一下,大家看看有什么問題

package main

import (
    "os"
    "net/http"
    "github.com/julienschmidt/httprouter"
    "fmt"
)

func main() {
    router := httprouter.New()
    //注冊上傳路由,及處理方法
    router.PUT("/upload_file/:file_name",handleUploadFile)

    http.ListenAndServe("0.0.0.0:10086", router)
}

func handleUploadFile(rw http.ResponseWriter, req *http.Request, p httprouter.Params){
    real_file_name := p.ByName("file_name")
    defer req.Body.Close()
    buf := make([]byte, 65536) // 64k per chunk
    filename := fmt.Sprintf("./chunk/%s", real_file_name)    //文件名
    fmt.Println(filename)
    //創(chuàng)建一個文件
    file, _ := os.Create(filename)
    defer file.Close()

    num := 0
    for {
        num += 1
        n, err := req.Body.Read(buf)
        fmt.Printf("第%d次循環(huán),讀取%d個字節(jié)\n",num,n)
        file.Write(buf[:n])
        if err != nil {
            fmt.Println(err)
            break
        }
    }

    rw.Write([]byte("done\n"))
}
回答
編輯回答
涼心人
  1. 如果文件很大,分片上傳即可,在客戶端分片,最后在服務(wù)器端組合成原文件,可以看看某些CDN api的實現(xiàn),比如阿里云CDN等都有分片上傳的實現(xiàn).因為大文件直接上傳時,碰到網(wǎng)絡(luò)中斷后就要重新開始, 那就要吐血了.
  2. http.Request.ContentLength是客戶端實現(xiàn)的,有興趣,就翻翻源碼.
  3. http.Request.Body無需全部接收到了內(nèi)容之后才能讀取,但讀取過程是阻塞的.
2017年4月3日 21:01