如何修复从我的端点下载时存档中权限被拒绝的文件?

问题描述 投票:0回答:1

我正在使用 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

当我手动更新权限以允许读/写时,我可以打开该文件。

问题是,为什么要使用此权限生成存档?更重要的是,如何使端点生成具有正确权限的存档以允许用户能够读取和写入它?

rust file-permissions tar rust-tokio
1个回答
0
投票

您的代码不会从磁盘上的文件创建存档。相反,它从磁盘读取文件,然后使用该文件的

std::io::Read
读取器来提供要存档的文件的字节。换句话说,归档库永远看不到文件元数据(包括权限),因此不可能复制原始权限。

因此,您需要以文件权限符合您想要的方式创建存档。我不是

tokio-tar
方面的专家,但快速浏览一下 docs 表明您可能想要使用
Builder::append_file
或使用您想要的权限显式构建
Header
(它有足够的权限)设置文件元数据的方法)。

一般来说,习惯阅读您正在使用的 crate 的文档是个好主意。查看可用的函数和类型,四处阅读,您可能会找到一些可以为您指明正确方向的内容。

© www.soinside.com 2019 - 2024. All rights reserved.