我正在使用地图将随机字符串键存储到* os.File对象。用户将要上传文件,我想在全局映射中保留对该文件的引用,以便以后删除它。
我有一个http处理程序来处理上传,最后,我将一个随机密钥从操作系统uuidgen映射到类型为* os.File的“ logBundleFile”。
var db = map[string]*os.File{}
func uploadHandler(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(5 << 30)
file, handler, err := r.FormFile("file")
if err != nil {
log.Fatalf("Error retrieving the file: %v", err)
return
}
defer file.Close()
logBundleFile, err := ioutil.TempFile("", handler.Filename)
if err != nil {
log.Fatal(err)
}
defer logBundleFile.Close()
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
log.Fatalf("Error reading file: %v", err)
}
logBundleFile.Write(fileBytes)
id, err := exec.Command("uuidgen").Output()
idStr := string(id[:])
//id := "1"
if err != nil {
log.Fatal(err)
}
db[idStr] = logBundleFile
log.Printf("ID: %v Type: %T\n", idStr, idStr)
log.Printf("val: %v Type: %T\n\n", db[idStr], db[idStr])
http.Redirect(w, r, fmt.Sprintf("/%s", idStr), http.StatusMovedPermanently)
}
完成后,您将重定向到该sessionHandler。它将检查主体中的ID是否有效,即是否映射到* os.File。 “ ok”布尔总是返回false。
func sessionHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
log.Printf("ID: %v Type: %T\n", id, id)
log.Printf("val: %v Type: %T\n", db[id], db[id])
if val, ok := db[id]; ok {
w.Write([]byte(fmt.Sprintf("Session %s %v", id, val)))
} else {
http.Redirect(w, r, "/", http.StatusMovedPermanently)
}
}
这是照片的输出。在uploadHandler中,我们可以看到我们有一个字符串键映射到非零* os.File。
但是在会话处理程序中,相同的字符串键映射到nil * os.File。我不知道发生了什么。
2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE
Type: string
2019/08/27 19:49:49 val: &{0xc000160120} Type: *os.File
2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE Type: string
2019/08/27 19:49:49 val: <nil> Type: *os.File
答案 0 :(得分:1)
这是因为在uploadHandler
中,id
变量包含换行符。如果我们仔细查看日志,就可以看到它。 Type: string
文本以某种方式打印在第二行中。
2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE // <-- newline
Type: string
2019/08/27 19:49:49 ID: BA06C157-451E-48B5-85F9-8069D9A4EFCE Type: string
在idStr
上放置修剪操作应该可以解决问题。
idStr := strings.TrimSpace(string(id[:]))