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
相关产品推荐
相关产品推荐

