Как разрешить пользователю загружать файл во время его создания - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу позволить пользователю начать скачивание файла, когда он еще не готов.Я не хочу отправлять пользователя на какую-либо страницу со словами «Подождите 30 секунд, файл готовится».Я не могу сгенерировать файл заранее.Мне нужно, чтобы пользователь щелкнул / отправил форму, выбрал место загрузки и начал загрузку.Сгенерированный файл будет zip, поэтому я предполагаю, что должна быть возможность отправить имя файла с первыми несколькими байтами zips (которые всегда одинаковы), и до того, как файл будет сгенерирован, не следует подтверждать, что tcp-пакет был отправлен правильно или что-то подобноечто, и после того, как файл сгенерирован, отправьте остальные.

Как мне это сделать?Есть ли инструмент, который может это сделать.Или есть какой-то лучший способ?Лучше решение высокого уровня, С не моя сильная сторона.Желательно в Python.Спасибо.

Генерируемый файл находится в zip-формате, и пока он не подготовлен, отправлять его пока нечем.В основном, в соответствии с вводом, я генерирую набор файлов (который занимает несколько десятков секунд), а затем архивирую их и предоставляю пользователю.Мое приложение в Python на Linux, но какой сервер я буду использовать, не очень важно.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Обычно такое приложение будет реализовано в двух частях, например, в системе заявок.

  1. Когда пользователь нажимает / отправляет форму, форма отправляет запрос в службу, которая будетначните генерировать файл как фоновый процесс, затем (не дожидаясь его создания) он сгенерирует тикет / хэш, который представляет новый файл, а затем перенаправит пользователя на новый URL, например, /files/<random-hash>

  2. На этом новом URL-адресе, /files/<random-hash>, пока файлы не готовы, он вернет простую HTML-страницу, на которой пользователю будет показано сообщение с ожиданием, и на странице будет скрипт, который будет обновлятьстраница каждые несколько секунд.Пока файлы не готовы, он будет показывать это сообщение, но как только файл будет готов, этот URL-адрес будет возвращать фактическое содержимое файлов в ответ с соответствующим заголовком mime.

Решение довольно просто реализовать с использованием базы данных и некоторого программирования.Хотя, если вы ищете уже готовый инструмент, готовый к использованию, извините, я не знаком с ним.Надеюсь, что это поможет.

0 голосов
/ 28 февраля 2019

Несмотря на претензии, это невозможно, мне удалось найти способ.Тем временем я немного изучил Go, поэтому я использовал это, но я думаю, что в других языках он не будет слишком отличаться.

В основном первый байт записывается в записывающем устройстве, а затем сбрасывается.Браузер чем ждет отдыха.

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)
    }
}
0 голосов
/ 05 декабря 2018

Скорее всего, клиент будет ожидать тайм-аут (или ждать 30 секунд без уведомления), пока файл готовится.Я бы использовал алгоритм сжатия потока (gzip) для сжатия файла (ов) во время передачи.Это не приведет к лучшему сжатию, но будет обслуживать файлы предсказуемым образом.

Изучите заголовок HTTP «Content-Encoding: gzip».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...