func deleteAndOthers(qs *models.Question, uid int64, role int64) error { if err := qs.Read(); err == orm.ErrNoRows { return errors.New("无法删除不存在的Question ID:" + strconv.Itoa(int(qs.Id))) } allow := role < 0 if !(qs.Uid == uid || role < 0) { return errors.New("你无权删除此问题:" + strconv.Itoa(int(qs.Id))) } //检查附件字段并尝试删除文件 if qs.Attachment != "" { if p := utils.Url2local(qs.Attachment); utils.Exist(p) { //验证是否管理员权限 if allow { if err := os.Remove(p); err != nil { //可以输出错误,但不要反回错误,以免陷入死循环无法删掉 fmt.Println("ROOT DEL Question Attachment, Question ID:", qs.Id, ",ERR:", err) } } else { //检查用户对文件的所有权 if utils.VerifyUserfile(p, strconv.Itoa(int(uid))) { if err := os.Remove(p); err != nil { fmt.Println("DEL Question Attachment, Question ID:", qs.Id, ",ERR:", err) } } } } } //检查内容字段并尝试删除文件 if qs.Content != "" { //若内容中存在图片则开始尝试删除图片 delfiles_local := []string{} if m, n := utils.GetImages(qs.Content); n > 0 { for _, v := range m { if utils.IsLocal(v) { delfiles_local = append(delfiles_local, v) //如果本地同时也存在banner缓存文件,则加入旧图集合中,等待后面一次性删除 if p := utils.Url2local(utils.SetSuffix(v, "_banner.jpg")); utils.Exist(p) { delfiles_local = append(delfiles_local, p) } if p := utils.Url2local(utils.SetSuffix(v, "_large.jpg")); utils.Exist(p) { delfiles_local = append(delfiles_local, p) } if p := utils.Url2local(utils.SetSuffix(v, "_medium.jpg")); utils.Exist(p) { delfiles_local = append(delfiles_local, p) } if p := utils.Url2local(utils.SetSuffix(v, "_small.jpg")); utils.Exist(p) { delfiles_local = append(delfiles_local, p) } } } for k, v := range delfiles_local { if p := utils.Url2local(v); utils.Exist(p) { //如若文件存在,则处理,否则忽略 //先行判断是否缩略图 如果不是则执行删除image表记录的操作 因为缩略图是没有存到image表记录里面的 isThumbnails := bool(true) //false代表不是缩略图 true代表是缩略图 if (!strings.HasSuffix(v, "_large.jpg")) && (!strings.HasSuffix(v, "_medium.jpg")) && (!strings.HasSuffix(v, "_small.jpg")) { isThumbnails = false } //验证是否管理员权限 if allow { if err := os.Remove(p); err != nil { fmt.Println("#", k, ",ROOT DEL FILE ERROR:", err) } //删除image表中已经被删除文件的记录 if !isThumbnails { if e := models.DelImageByLocation(v); e != nil { fmt.Println("DelImageByLocation删除未使用文件", v, "的数据记录时候出现错误:", e) } } } else { //检查用户对文件的所有权 if utils.VerifyUserfile(p, strconv.Itoa(int(uid))) { if err := os.Remove(p); err != nil { fmt.Println("#", k, ",DEL FILE ERROR:", err) } //删除image表中已经被删除文件的记录 if !isThumbnails { if e := models.DelImageByLocation(v); e != nil { fmt.Println("v:", v) fmt.Println("DelImageByLocation删除未使用文件", v, "的数据记录时候出现错误:", e) } } } } } } } } // 不管实际路径中是否存在文件均删除该数据库记录,以免数据库记录陷入死循环无法删掉 if err := qs.Delete(); err != nil { fmt.Println("删除话题错误:", err) //此时居然为空! } // 删除该问题下所有答案 if err := models.DelReplysByPid(qs.Id); err != nil { fmt.Println("执行DelReplysByPid出错:", err) return err } return nil }