该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//多文件批量上传
func upload(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(64 << 20) //64MB内存buffer
var uplFail, upSucc int
var rename string
for _, fileHeader := range r.MultipartForm.File["uploadfile"] {
srcFile, err := fileHeader.Open()
if err != nil {
log.Println(err)
return
}
fpath := filepath.Join(curDir, fileHeader.Filename)
originPath := fpath
for {
_, err := os.Stat(fpath)
if err == nil {
//如果文件存在,则重命名上传文件(.扩展名前加"_New")
suffix := filepath.Ext(fpath)
withoutSuf := strings.TrimSuffix(fpath, suffix)
fpath = withoutSuf + "_New" + suffix
} else {
break
}
}
if originPath != fpath {
rename = rename + fmt.Sprintf("%-s  上传后被重命名为:  %-s ", originPath, fpath)
}
dstFile, err := os.Create(fpath) //创建上传文件
if err != nil {
log.Println(err)
srcFile.Close()
return
}
_, err = io.Copy(dstFile, srcFile)
if err != nil {
uplFail++
} else {
log.Printf("%s upload %q success\n", r.RemoteAddr[:strings.LastIndex(r.RemoteAddr, ":")], filepath.Join(root, dstFile.Name()))
upSucc++
}
srcFile.Close() //这里是循环,避免用defer *.Close()
dstFile.Close()
}
fmt.Fprintf(w, "
上传失败:%d, 成功:%d
%s
", uplFail, upSucc, rename, curDir, 1+len(strings.Split(rename, "")))}