Go文件上傳下載

使用io包和net包實(shí)現(xiàn)基于http的文件上傳下載


func handleUpload (w http.ResponseWriter, request *http.Request) {

    //文件上傳只允許POST方法

    if request.Method != http.MethodPost {

        w.WriteHeader(http.StatusMethodNotAllowed)

        _, _ = w.Write([]byte("Method not allowed"))

        return

    }

    //從表單中讀取文件

    file, fileHeader, err := request.FormFile("file")

    if err != nil {

        _, _ = io.WriteString(w, "Read file error")

        return

    }

    //defer 結(jié)束時關(guān)閉文件

    defer file.Close()

    log.Println("filename: " + fileHeader.Filename)

    //創(chuàng)建文件

    newFile, err := os.Create( "./" + fileHeader.Filename)

    if err != nil {

        _, _ = io.WriteString(w, "Create file error")

        return

    }

    //defer 結(jié)束時關(guān)閉文件

    defer newFile.Close()

    //將文件寫到本地

    _, err = io.Copy(newFile, file)

    if err != nil {

        _, _ = io.WriteString(w, "Write file error")

        return

    }

    _,_ = io.WriteString(w, "Upload success")

func handleDownload (w http.ResponseWriter, request *http.Request) {
    //文件上傳只允許GET方法
    if request.Method != http.MethodGet {
        w.WriteHeader(http.StatusMethodNotAllowed)
        _, _ = w.Write([]byte("Method not allowed"))
        return
    }
    //文件名
    filename := request.FormValue("filename")
    if filename == "" {
        w.WriteHeader(http.StatusBadRequest)
        _, _ = io.WriteString(w, "Bad request")
        return
    }
    log.Println("filename: " + filename)
    //打開文件
    file, err := os.Open(BaseUploadPath + "/" + filename)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        _, _ = io.WriteString(w, "Bad request")
        return
    }
    //結(jié)束后關(guān)閉文件
    defer file.Close()

    //設(shè)置響應(yīng)的header頭
    w.Header().Add("Content-type", "application/octet-stream")
    w.Header().Add("content-disposition", "attachment; filename=\""+filename+"\"")
    //將文件寫至responseBody
    _, err = io.Copy(w, file)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        _, _ = io.WriteString(w, "Bad request")
        return
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炕舵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟆淀,老刑警劉巖幌衣,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒸眠,死亡現(xiàn)場離奇詭異圆凰,居然都是意外死亡远舅,警方通過查閱死者的電腦和手機(jī)带污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門僵控,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鱼冀,你說我怎么就攤上這事报破。” “怎么了千绪?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵充易,是天一觀的道長。 經(jīng)常有香客問我荸型,道長盹靴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任瑞妇,我火速辦了婚禮稿静,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辕狰。我一直安慰自己改备,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布蔓倍。 她就那樣靜靜地躺著悬钳,像睡著了一般盐捷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上默勾,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天碉渡,我揣著相機(jī)與錄音,去河邊找鬼灾测。 笑死爆价,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳搪。 我是一名探鬼主播铭段,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秦爆!你這毒婦竟也來了序愚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤等限,失蹤者是張志新(化名)和其女友劉穎爸吮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體望门,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡形娇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筹误。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桐早。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厨剪,靈堂內(nèi)的尸體忽然破棺而出哄酝,到底是詐尸還是另有隱情,我是刑警寧澤祷膳,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布陶衅,位于F島的核電站,受9級特大地震影響直晨,放射性物質(zhì)發(fā)生泄漏搀军。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一勇皇、第九天 我趴在偏房一處隱蔽的房頂上張望奕巍。 院中可真熱鬧,春花似錦儒士、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诅福。三九已至,卻和暖如春拖叙,著一層夾襖步出監(jiān)牢的瞬間氓润,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工薯鳍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咖气,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓挖滤,卻偏偏與公主長得像崩溪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斩松,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350