You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android使用Retrofit上传视频时遇FileNotFoundException问题

解决Retrofit上传视频时的FileNotFoundException(目录而非文件)

你遇到的这个java.io.FileNotFoundException异常,核心原因很明确:你代码里指向的/data/user/0/com.flexyn.debug/files/mydir是一个目录,但你却把它当成了要写入或上传的文件来操作,系统自然会报错。下面给你一步步梳理解决方案:

1. 修正convertVideoPathToFile()的文件创建逻辑

你的代码目前只创建了存储目录,没有指定具体的视频文件名。正确的做法是先确保目录存在,再创建具体的文件实例:

private File convertVideoPathToFile() {
    // 先定义存放视频的目录
    File videoDir = new File(getFilesDir(), "mydir");
    // 递归创建目录(如果不存在)
    if (!videoDir.exists()) {
        videoDir.mkdirs();
    }
    // 创建具体的视频文件(用时间戳命名避免重复)
    File compressedVideoFile = new File(videoDir, "compressed_" + System.currentTimeMillis() + ".mp4");

    FileOutputStream outputStream = null;
    try {
        // 这里初始化输出流,指向具体的文件而非目录
        outputStream = new FileOutputStream(compressedVideoFile);
        // 执行你的视频压缩逻辑,将数据写入outputStream
        // ...(你的压缩代码)
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 记得关闭流
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return compressedVideoFile;
}

2. 确认Retrofit上传的参数指向正确文件

传给Retrofit的MultipartBody.Part必须是刚才创建的具体文件,而不是目录:

// 从你的方法获取正确的文件实例
File videoFile = convertVideoPathToFile();
// 创建请求体
RequestBody requestFile = RequestBody.create(MediaType.parse("video/mp4"), videoFile);
// 构建上传的Part
MultipartBody.Part videoPart = MultipartBody.Part.createFormData("video", videoFile.getName(), requestFile);

3. 额外排查点

  • 如果是视频压缩库导致的问题,检查压缩工具的输出路径配置,确保它输出到具体文件而非目录;
  • 内部存储默认不需要动态权限,但如果你的目录路径有特殊配置,确认应用对该路径有读写权限。

核心问题就是把目录路径误当成了文件路径,只要修正这一点,这个异常就能解决啦!

内容的提问来源于stack exchange,提问作者Priyanka Valecha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:59:01