为了账号安全,请及时绑定邮箱和手机立即绑定

提供后删除文件?

提供后删除文件?

Go
翻过高山走不出你 2022-07-25 11:14:29
一旦提供了一次内容,有没有办法从服务器中删除整个静态目录?(服务是指在浏览器上显示一次)。func main() {    fs := http.FileServer(http.Dir(tempDir))    http.Handle("/", fs)    http.HandleFunc("/app/wo", workOrderApp)    log.Fatal(http.ListenAndServe(":"+os.Args[1], nil))}func workOrderApp(w http.ResponseWriter, r *http.Request) {    workOrderAppProcess(w)    time.Sleep(time.Duration(4 * time.Second)) //some time to let render the html    os.RemoveAll(tempDir)}这sleep os.RemoveAll是一个打击和错过。必须将睡眠时间调整为几秒钟,否则有时会提供文件,有时不提供文件,我相信是因为带宽或网络相关的东西。但它也有延迟整个页面渲染的副作用。在此示例中,我删除了所有目录,这正是我想要的。func workOrderAppProcess(aid, date, language, token string, w http.ResponseWriter) {    zipDir := os.Args[2]    if _, err := os.Stat(tempDir); os.IsNotExist(err) {        log.Printf("Creating directory: %v", tempDir)        err := os.MkdirAll(tempDir, 0777)        if err != nil {            log.Print(err.Error())        }    }    log.Printf("Extracting file: %v to: %v", date+".zip", tempDir)    zipPath, _ := filepath.Abs(zipDir + "/" + date + ".zip")    app.ExtractZip(zipPath, tempDir)    batch := app.ReturnBatchNumber(tempDir + date)    typesData := app.ReturnWorkTypeData(app.ParseXML(tempDir + date + "/" + batch + "_type_list.xml"))    record := app.FindAppointmentRecord(aid, app.ParseXML(tempDir+date+"/"+batch+"_appt.xml"))    signatureFileURL := app.ReturnSignatureFileURL(tempDir+date, aid, date)    app.RenderTemplate(record, typesData, "template/wo.html", language, "/"+signatureFileURL, w)}
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

您的代码导致 HTTP 处理程序等待 4 秒,删除文件,然后完成 HTTP 响应。只需删除睡眠。


func workOrderApp(w http.ResponseWriter, r *http.Request) {

    workOrderAppProcess(w)

    os.RemoveAll(tempDir)

}

这更有效,更直接地反映了您的意图,并且不会让 HTTP 连接不必要地打开额外的 4 秒。


如果您的处理程序中未显示其他逻辑,并且您希望确保在所有情况下都发生删除,则 adefer可能很有用:


func workOrderApp(w http.ResponseWriter, r *http.Request) {

    workOrderAppProcess(w)

    defer os.RemoveAll(tempDir)

    /* Other logic that may do things */

}

在聊天中讨论之后,很明显workOrderAppProcess正在呈现您的 HTML,并且os.RemoveAll正在删除该 HTML 所需的图像。要解决此问题,您需要延迟删除,但要在提供 HTML 之后。这可以通过一个简单的 goroutine 来完成:


func workOrderApp(w http.ResponseWriter, r *http.Request) {

    workOrderAppProcess(w)

    go func() {

        time.Sleep(60 * time.Second)

        os.RemoveAll(tempDir)

    }()

}


查看完整回答
反对 回复 2022-07-25
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号