HarmonyOS 鸿蒙Next下载文件问题

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next下载文件问题

if (res.code == 200) {
data = res.data as fileDetail
url = data.url
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
let filePath = getContext(this).cacheDir +’/’+data.name+’.’+data.fileType
// /storage/Users/currentUser/Download/${data.name}.${data.fileType}
// 下载。如果文件已存在,则先删除文件。
console.info(filePath,‘下载地址’)
try {
fs.accessSync(filePath);
fs.unlinkSync(filePath);
} catch (err) {
}
let SESSION_CONFIG: rcp.SessionConfiguration = {
requestConfiguration: {
transfer: {
autoRedirect: true,
timeout: {
connectMs: 600000,
transferMs: 600000
}
},
tracing: {
verbose: true
}
},
}
const session = rcp.createSession(SESSION_CONFIG);
const respMemory = await session.get(url);
const dataMemory = respMemory.toString();
if (fileIo.accessSync(filePath)) {
fileIo.unlinkSync(filePath);
}
const resp = await session.downloadToFile(url, {
kind: ‘file’,
file: filePath
});
session.close(); 下载文件功能 将路径写成这样可以成功/storage/Users/currentUser/Download/${data.name}.${data.fileType}

如果写成这样let filePath = getContext(this).cacheDir +’/’+data.name+’.’+data.fileType 就找不到文件

有没有大神有更好的方法 求推荐!!


更多关于HarmonyOS 鸿蒙Next下载文件问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

建议downloadToFile单独设置一下

let downloadToFile: rcp.DownloadToFile = {
  kind: 'file',
  path: filePath
} as rcp.DownloadToFile 

然后下载路径可以换成下面方式试试

let context = getContext(this) as common.UIAbilityContext;
let filePath = context.filesDir + '/'+data.name+'.'+data.fileType

更多关于HarmonyOS 鸿蒙Next下载文件问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你的问题可能出在 getContext(this).cacheDir 路径的获取或使用方式上。以下是可能的解决方案:

问题分析
1. cacheDir 和目标目录问题
getContext(this).cacheDir 通常返回应用的缓存目录(例如 /data/data/<package-name>/cache),而你写的路径 /storage/Users/currentUser/Download/ 是存储目录。这两者的权限和可用性可能不同,尤其是在 Android 系统中。
2. 权限问题
在缓存目录写入文件时,应用通常有权限,但如果缓存路径有问题(如没有被正确初始化),则可能会失败。
3. 文件名拼接问题
如果 data.name 或 data.fileType 包含非法字符(如 /、空格等),也会导致路径错误。

解决方案

1. 确认 cacheDir 是否正确

在路径出问题时,先打印出 cacheDir,确保它返回了预期的路径:

let cacheDir = getContext(this).cacheDir;
console.info(‘Cache Directory:’, cacheDir);

2. 使用标准目录

如果你的文件需要保存到 Download 目录,建议直接使用 Environment 提供的标准下载目录路径:

let filePath = ${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()}/${data.name}.${data.fileType};
console.info(‘File Path:’, filePath);

3. 检查拼接路径

确保拼接的路径是合法的文件路径,可以使用正则表达式清理非法字符:

let safeName = data.name.replace(/[^a-zA-Z0-9_-.]/g, '’); // 替换非法字符
let filePath = ${getContext(this).cacheDir}/${safeName}.${data.fileType};

4. 添加错误处理

为每个潜在的问题点添加错误日志,以便跟踪失败原因:

try {
    fs.accessSync(filePath);
    fs.unlinkSync(filePath);
} catch (err) {
    console.error(‘File Access Error:’, err);
}

5. 更改下载逻辑

确保下载到缓存目录的文件路径是应用有权限访问的路径:

const resp = await session.downloadToFile(url, {
    kind: ‘file’,
    file: filePath // 确保是有效路径
});

完整代码调整

以下是调整后的完整代码片段:

if (res.code == 200) {
    data = res.data as fileDetail;
    url = data.url;
    let context = getContext(this) as common.UIAbilityContext;
    let filesDir = context.filesDir;
    let safeName = data.name.replace(/[^a-zA-Z0-9
-.]/g, ‘_’); // 替换非法字符
    let filePath = ${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()}/${safeName}.${data.fileType};

    console.info(filePath, ‘下载地址’);

    // 下载前清理文件
    try {
        fs.accessSync(filePath);
        fs.unlinkSync(filePath);
    } catch (err) {
        console.warn(‘File Cleanup Warning:’, err);
    }

    let SESSION_CONFIG: rcp.SessionConfiguration = {
        requestConfiguration: {
            transfer: {
                autoRedirect: true,
                timeout: {
                    connectMs: 600000,
                    transferMs: 600000
                }
            },
            tracing: {
                verbose: true
            }
        }
    };
    const session = rcp.createSession(SESSION_CONFIG);

    try {
        const resp = await session.downloadToFile(url, {
            kind: ‘file’,
            file: filePath
        });
        console.info(‘Download Success:’, resp);
    } catch (err) {
        console.error(‘Download Error:’, err);
    } finally {
        session.close();
    }
}

验证步骤
1. 打印出 cacheDir 和 filePath,确保路径合法。
2. 使用日志记录 fs.accessSync 和 fileIo.accessSync 的行为。
3. 确保下载路径有足够的写入权限。

您好 Environment.getExternalStoragePublicDirectory 这个什么什么属性 我看 Environment中没有getExternalStoragePublicDirectory

针对HarmonyOS 鸿蒙Next下载文件问题,以下是一些直接相关的解决思路:

在HarmonyOS系统中,下载文件通常依赖于系统提供的下载管理器或第三方应用。若遇到下载问题,首先检查网络连接状态,确保设备已连接到稳定且速度足够的网络。

  1. 检查应用权限: 确保下载应用已授予存储和网络访问权限。在系统设置中检查并调整应用权限设置。

  2. 下载路径设置: 检查下载路径是否正确,并确保该路径下的存储空间足够。部分应用允许用户自定义下载路径,确保路径有效且可写。

  3. 下载管理器状态: 如果系统提供下载管理器,检查其运行状态和设置。有时,下载管理器可能因为系统更新或配置问题而停止工作。

  4. 文件格式支持: 确认下载的文件格式是否被设备或下载应用支持。不支持的文件格式可能无法正确下载或打开。

  5. 应用更新: 检查下载应用是否有更新版本。开发者可能已经在新版本中修复了下载问题。

  6. 系统日志: 查看系统日志以获取更多关于下载失败的信息。这可能需要一定的技术背景,但可以提供解决问题的线索。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!