golang 下載和上傳,處理多文件上傳


package main

import (
"net/http"
"os"
"io"
"strconv"
)


func main() {
f, err := os.OpenFile("K:/file.mp3", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
stat, err := f.Stat() //獲取文件狀態
if err != nil { panic(err) } //把文件指針指到文件末,當然你說為何不直接用 O_APPEND 模式打開,沒錯是可以。我這里只是試驗。
url := "http://127.0.0.1:3000/assets/37-02.mp3"

req,_ := http.NewRequest("GET",url,nil);
req.Header.Set("Range", "bytes=" + strconv.FormatInt(stat.Size(),10) + "-")
resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
written, err := io.Copy(f, resp.Body)
if err != nil { panic(err) }
println("written: ", written)
}



服務器的話就更簡單了,這個是忽略url中的/assets/,直接找到對應的raido目錄
var staticHandler http.Handler

// 靜態文件處理
func StaticServer(w http.ResponseWriter, req *http.Request) {
    fmt.Println("path:" + req.URL.Path)
    staticHandler.ServeHTTP(w, req)
}
func init(){
    staticHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("radio")))
}

func main() {//已經有靜態文件了
    http.HandleFunc("/assets/",StaticServer)
    err := http.ListenAndServe(":3000", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

 

處理多文件上傳,如果是以數組的形式post,后面那個[]不要忘記,因為golang保留了那個中括號.

如果form里面變量都是唯一的,直接用parseformvalue,和parsefile就可以,因為返回的都是單個變量而不是一個數組了,省的另外操作數組。

if r.Method == "POST" {

        r.ParseMultipartForm(8 << 20)
        title := r.ParseFormValue["title"]
        fhs := r.MultipartForm.File["radio[]"]
        options := r.MultipartForm.Value["options[]"]
        answers := r.MultipartForm.Value["answers[]"]

        l := len(options)
        optionDirs := make([]string, l)
        t := time.Now()
        for i := 0; i < l; i++ {
            file, err := fhs[i].Open()
            if err != nil {
                panic(err)
            }
            filename := fhs[i].Filename
            f, err := os.OpenFile("statics/"+filename, os.O_WRONLY|os.O_CREATE, 0666)
            if err != nil {
                panic(err)
            }
            defer f.Close()
            io.Copy(f, file)
            optionDirs = append(optionDirs, filename)
        }
        db.InsertHomework(&db.HomeWork{
            Title:      title,
            Options:    options,
            OptionDirs: optionDirs,
            Answers:    answers,
            Time:       t,
        })
        sess := session.GlobalSessionManager.SessionStart(w, r)
        if sess != nil {
            sess.Set("flash", true)
        }
        defer sess.SessionRelease()
        http.Redirect(w, r, "/homeworks", http.StatusFound)
    }

要用multiform.File就可以獲得那個文件的描述頭,然后調用fsh[o].Open就能獲得文件對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM