Here is my scenario, I have written an API endpoint using actix-web and rust which is running inside a Linux VM. When the API is hit, it runs a job and creates a zip file. This zip file is around 3.5 GB in size.
我有一个在Reaction中编写的前端(也在同一个VM上运行),当上述后台作业(job)完成时,它将向用户显示一个下载按钮.
现在,我想将这个文件从创建Zip文件的后端传输到用户的桌面.我try 了不同网站上提到的一些方法,它确实奏效了,但有一个问题:整个3.5 GB的文件立即被发送到用户端,并被加载到最终用户的浏览器内存中,之后下载进度指示器开始,现在只要下载完成,浏览器就会崩溃.
我知道这不是发送/处理大文件的正确方式,使用块可能是发送数据的一种方式,也可能使用流.这两个我都不会写,因为我对使用铁 rust 还很陌生.我甚至想过将压缩文件存储在某个存储桶中,但这只会增加成本,加上我有一些策略限制,所以放弃了这个 idea .
请帮助我了解如何在互联网上提供这些大文件,和/或如何将文件拆分成块.
如果能有任何帮助,我将不胜感激
以下是我try 过的:
use actix_files::NamedFile;
use actix_web::{get, HttpRequest, Result};
use actix_http::http::{header, ContentDisposition, DispositionType};
use mime::Mime;
const FILE_PATH: &str = "/path/to/my/zip/fille/xyz.zip";
#[get("/api/v1/downloads/xyz.zip")]
async fn downloader(req: HttpRequest) -> Result<NamedFile> {
let file = NamedFile::open(FILE_PATH)?;
let content_disposition = ContentDisposition {
disposition: DispositionType::Attachment,
parameters: vec![],
};
let content_type: Mime = "application/zip".parse().unwrap();
Ok(file
.set_content_disposition(content_disposition)
.set_content_type(content_type))
}