簡體   English   中英

如何讓用戶在生成文件時下載文件

[英]How to let user download file while it's being generated

我想讓用戶在尚未准備就緒時開始下載文件。 我不想將用戶發送到某個頁面,說“等待30秒,文件正在准備中”。 我無法提前生成文件。 我需要用戶點擊/發送表格,選擇下載位置並開始下載。 生成的文件將是zip,所以我想,應該可以使用拉鏈的前幾個字節(總是相同的)發送文件名,並且在生成文件之前不確認tcp包是否正確發送或類似那,並在生成文件后發送其余的。

我怎么做? 有沒有任何工具可以做到這一點。 還是有更好的方法嗎? 更高級別的解決方案更好,C不是我的強項。 最好是在Python中。 謝謝。

正在生成的文件是zip,在准備好之前,還沒有任何東西可以發送。 基本上根據輸入我生成一組文件(這需要幾十秒),而不是我壓縮它們並為用戶服務。 我的應用程序是在Linux上的python中,但我將使用哪個服務器並不重要。

文件准備好后,客戶端很可能會超時(或等待30秒而不通知)。 我會使用流壓縮算法(gzip)來壓縮文件在傳輸過程中。 這不會導致最佳壓縮,但會以可預測的方式提供文件。

調查“Content-Encoding:gzip”HTTP標頭。

通常,像這樣的應用程序將分兩部分實現,例如票務系統。

  1. 當用戶單擊/提交表單時,表單將向服務發送請求,該服務將開始生成文件作為后台進程,然后(無需等待文件生成)它將生成表示新文件的票證/哈希然后將用戶重定向到新的URL,例如/files/<random-hash>

  2. 在這個新的URL /files/<random-hash> ,當文件沒有准備好時,它將返回一個簡單的HTML頁面,向用戶顯示要等待的消息,並在頁面上有一個腳本,將繼續刷新頁面每隔幾秒鍾。 只要文件沒有准備好,它就會繼續顯示此消息,但是一旦文件准備就緒,該URL將返回其響應中的實際文件內容,而不是相應的mime-header。

使用數據庫和一些編程實現該解決方案非常簡單。 但是,如果你正在尋找一個已經准備好使用的工具,我很抱歉我不熟悉它。 希望這有幫助。

盡管聲稱這是不可能的,但我設法找到了辦法。 我在此期間學到了一些Go,所以我使用了它,但我猜它在其他語言中不會有太大的不同。

基本上第一個字節寫在writer中然后刷新。 瀏覽器比等待休息。

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
    "strings"
    "time"
)

func Zip(w http.ResponseWriter, r *http.Request) {
    file_name := r.URL.Path
    file_name = strings.TrimPrefix(file_name, "/files/")

    w.Header().Set("Content-type", "application/zip")
    w.Write([]byte{80})
    if f, ok := w.(http.Flusher); ok {
        f.Flush()
    }
    for {
        if _, err := os.Stat("./files/" + file_name); err == nil {
            fmt.Println("file found, breaking")
            break
        }
        time.Sleep(time.Second)
    }
    stream_file_bytes, err := ioutil.ReadFile("./files/" + file_name)
    if err != nil {
        fmt.Println(err)
        return
    }

    b := bytes.NewBuffer(stream_file_bytes)
    b.Next(1)
    b.WriteTo(w)
    fmt.Println("end")
}

func main() {
    http.HandleFunc("/files/", Zip)
    if err := http.ListenAndServe(":8090", nil); err != nil {
        panic(err)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM