Golang + HTML5 实现多文件上传
---------------------------
今天刚好有点时间,就想试试Golang的多文件上传,下面是实现的代码。
package main
//多文件上传
//作者:LvanNeo
//邮箱:lvan_software@foxmail.com
//日期:2014-04-17
//Golang + HTML5 实现多文件上传
import (
"fmt"
"io"
"log"
"net/http"
"os"
"time"
)
//跳转上传页面
//作者:LvanNeo
//邮箱:lvan_software@foxmail.com
//日期:2014-04-17
func indexHandle(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
fmt.Println("获取页面失败")
}
}()
// 上传页面
w.Header().Add("Content-Type", "text/html")
w.WriteHeader(200)
html := `
Golang Upload Files
`
io.WriteString(w, html)
}
//处理文件上传的 Web服务方法
//作者:LvanNeo
//邮箱:lvan_software@foxmail.com
//日期:2014-04-17
func UploadServer(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
fmt.Println("文件上传异常")
}
}()
if "POST" == r.Method {
r.ParseMultipartForm(32 << 20) //在使用r.MultipartForm前必须先调用ParseMultipartForm方法,参数为最大缓存
// fmt.Println(r.MultipartForm)
// fmt.Println(r.MultipartReader())
if r.MultipartForm != nil && r.MultipartForm.File != nil {
fhs := r.MultipartForm.File["userfile"] //获取所有上传文件信息
num := len(fhs)
fmt.Printf("总文件数:%d 个文件", num)
//循环对每个文件进行处理
for n, fheader := range fhs {
//获取文件名
filename := fheader.Filename
//结束文件
file,err := fheader.Open()
if err != nil {
fmt.Println(err)
}
//保存文件
defer file.Close()
f, err := os.Create(filename)
defer f.Close()
io.Copy(f, file)
//获取文件状态信息
fstat,_ := f.Stat()
//打印接收信息
fmt.Fprintf(w, "%s NO.: %d Size: %d KB Name:%s\n", time.Now().Format("2006-01-02 15:04:05"), n, fstat.Size()/1024, filename)
fmt.Printf("%s NO.: %d Size: %d KB Name:%s\n", time.Now().Format("2006-01-02 15:04:05"), n, fstat.Size()/1024, filename)
}
}
return
} else {
indexHandle(w,r)
}
}
func main() {
fmt.Println("Listening Port: 8086")
http.HandleFunc("/", indexHandle)
http.HandleFunc("/upload", UploadServer)
err := http.ListenAndServe(":8086", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}