我正在使用 Actix Web 和 Tokio Tar 实现一个端点来下载存档文件。
存档生成的代码的灵感来自于示例中显示的代码这里
转载如下:
let mut ar = Builder::new(Cursor::new(vec![]));
for (path, file) in files {
let mut header = Header::new_gnu();
header.set_size(file.len() as u64);
header.set_cksum();
ar.append_data(&mut header, path, Cursor::new(file)).await?;
}
let ar_data = ar.into_inner().await?;
Ok(HttpResponse::Ok()
.append_header(("Content-Disposition", "attachment; filename=\"archive.tar\""))
.body(ar_data.into_inner()))
当我访问端点时,我可以下载存档,也可以解压它。现在的问题是,存档中的所有文件似乎都有错误的权限。我打不开。
当我检查权限时,这就是我得到的
ls -l /Users/me/Downloads/archive
total 32
---------- 1 me staff 83 Jan 1 1970 one.md
---------- 1 me staff 2267 Jan 1 1970 two.png
---------- 1 me staff 4708 Jan 1 1970 three.svg
drwxr-xr-x@ 3 me staff 96 Oct 21 19:37 src
当我手动更新权限以允许读/写时,我可以打开该文件。
问题是,为什么要使用此权限生成存档?更重要的是,如何使端点生成具有正确权限的存档以允许用户能够读取和写入它?
您的代码不会从磁盘上的文件创建存档。相反,它从磁盘读取文件,然后使用该文件的
std::io::Read
读取器来提供要存档的文件的字节。换句话说,归档库永远看不到文件元数据(包括权限),因此不可能复制原始权限。
因此,您需要以文件权限符合您想要的方式创建存档。我不是
tokio-tar
方面的专家,但快速浏览一下 docs 表明您可能想要使用 Builder::append_file
或使用您想要的权限显式构建 Header
(它有足够的权限)设置文件元数据的方法)。
一般来说,习惯阅读您正在使用的 crate 的文档是个好主意。查看可用的函数和类型,四处阅读,您可能会找到一些可以为您指明正确方向的内容。