Skip to main content

wx_rust_common/util/fs/
file_utils.rs

1//! 文件工具。
2//!
3//! 对应 Java `me.chanjar.weixin.common.util.fs.FileUtils`。
4
5/// 文件工具。
6pub struct FileUtils;
7
8impl FileUtils {
9    /// 创建临时文件并写入内容。
10    ///
11    /// # 参数
12    /// - `content`:文件内容
13    /// - `name`:文件名前缀
14    /// - `ext`:扩展名(不含点)
15    /// - `tmp_dir`:临时文件夹目录(`None` 时使用系统临时目录下的 `wxjava-temp`)
16    ///
17    /// # 返回
18    /// 临时文件路径。
19    pub fn create_tmp_file(
20        content: &[u8],
21        name: &str,
22        ext: &str,
23        tmp_dir: Option<&std::path::Path>,
24    ) -> Result<std::path::PathBuf, std::io::Error> {
25        let dir = match tmp_dir {
26            Some(d) => d.to_path_buf(),
27            None => {
28                let base = std::env::temp_dir();
29                let d = base.join("wxjava-temp");
30                std::fs::create_dir_all(&d)?;
31                d
32            }
33        };
34        // 对应 Java File.createTempFile(name, '.'+ext, dir)
35        let mut path = dir.join(format!("{name}{}", std::process::id()));
36        // 追加随机后缀避免冲突
37        let rand_suffix: String = (0..8)
38            .map(|_| {
39                let c = rand::random::<u8>() % 36;
40                if c < 10 {
41                    (b'0' + c) as char
42                } else {
43                    (b'a' + c - 10) as char
44                }
45            })
46            .collect();
47        path.set_file_name(format!("{name}{rand_suffix}.{ext}"));
48        std::fs::write(&path, content)?;
49        // deleteOnExit 等价:由调用方负责清理;此处不做自动删除(跨平台安全)
50        Ok(path)
51    }
52
53    /// 将输入流转为 Base64 字符串。
54    ///
55    /// 对应 Java `FileUtils.imageToBase64ByStream`:读取流全部内容后以标准
56    /// Base64 编码返回。Java 读取失败时打印堆栈并返回 `null`,Rust 以
57    /// `Result::Err` 表达同一错误路径。
58    pub fn image_to_base64_by_stream<R: std::io::Read>(
59        reader: &mut R,
60    ) -> Result<String, std::io::Error> {
61        use base64::Engine;
62        let mut data = Vec::new();
63        reader.read_to_end(&mut data)?;
64        Ok(base64::engine::general_purpose::STANDARD.encode(&data))
65    }
66}