猿问

提供后删除文件?

一旦提供了一次内容,有没有办法从服务器中删除整个静态目录?(服务是指在浏览器上显示一次)。


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)

}


翻过高山走不出你
浏览 133回答 1
1回答

倚天杖

您的代码导致 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)    }()}
随时随地看视频慕课网APP

相关分类

Go
我要回答