zoukankan      html  css  js  c++  java
  • golang 下载和上传,处理多文件上传

     

    ggaaooppeennngg · 2014-10-04 19:26:06 · 16819 次点击 · 预计阅读时间 3 分钟 · 大约1分钟之前 开始浏览    
    这是一个创建于 2014-10-04 19:26:06 的文章,其中的信息可能已经有所发展或是发生改变。

    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就能获得文件对象。

  • 相关阅读:
    U132973 双生独白
    Remmarguts' Date(A* 短路)
    P3908 数列之异或
    P1469 找筷子
    P1759 通天之潜水
    P2356 弹珠游戏
    P7072 直播获奖
    P7074 方格取数
    CSP2020二轮游记
    P6205 [USACO06JAN]Dollar Dayz S
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/15210922.html
Copyright © 2011-2022 走看看