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

iOS与Expo 50中FileSystem copyAsync无法正常工作求助

解决Expo 50 iOS上FileSystem.copyAsync复制ph:// URI文件失败的问题

问题原因

ph://格式的URI是iOS Photos框架的资源标识符,并非直接可访问的文件路径。Expo的FileSystem无法直接读取这类URI,因为它们指向系统相册中的资源,而非应用沙盒内的可访问文件,因此调用copyAsync时会提示"File '' is not readable"错误。

解决方案

方案一:使用expo-image-picker的缓存复制选项(若通过图片选择器获取资源)

如果图片是通过expo-image-picker获取的,只需在调用选择器时添加copyToCacheDirectory: true参数,它会自动将选中的照片复制到应用缓存目录,并返回file://开头的可访问URI:

import * as ImagePicker from 'expo-image-picker';
import * as FileSystem from 'expo-file-system';

// 请求相册权限
const permissionResult = await ImagePicker.requestMediaLibraryPermissionsAsync();
if (!permissionResult.granted) {
  alert('需要相册访问权限');
  return;
}

// 启动图片选择器并开启缓存复制
const result = await ImagePicker.launchImageLibraryAsync({
  mediaTypes: ImagePicker.MediaTypeOptions.Images,
  allowsEditing: false,
  copyToCacheDirectory: true, // 关键参数
});

if (!result.canceled) {
  const uri = result.assets[0].uri;
  const uriParts = uri.split(".");
  const fileType = uriParts[uriParts.length - 1];
  const time = new Date().getTime();
  const newUri = `${FileSystem.documentDirectory}/${time}.${fileType}`;

  // 执行复制操作
  await FileSystem.copyAsync({
    from: uri,
    to: newUri,
  });
}

方案二:使用expo-media-library获取可访问的本地路径(若已有ph:// URI)

如果已经持有ph://格式的URI,可以通过expo-media-library获取资源的本地可访问路径:

import * as MediaLibrary from 'expo-media-library';
import * as FileSystem from 'expo-file-system';

// 请求相册权限
const permissionResult = await MediaLibrary.requestPermissionsAsync();
if (!permissionResult.granted) {
  alert('需要相册访问权限');
  return;
}

// 获取资源信息,拿到本地可访问URI
const assetInfo = await MediaLibrary.getAssetInfoAsync(photo.uri);
const localUri = assetInfo.localUri;

// 执行复制操作
const uriParts = localUri.split(".");
const fileType = uriParts[uriParts.length - 1];
const time = new Date().getTime();
const newUri = `${FileSystem.documentDirectory}/${time}.${fileType}`;

await FileSystem.copyAsync({
  from: localUri,
  to: newUri,
});

注意事项

  • 需在app.json的ios.infoPlist中配置权限描述:
    • 对于expo-image-picker:添加"NSPhotoLibraryUsageDescription"字段
    • 对于expo-media-library:添加"NSPhotoLibraryUsageDescription"和"NSPhotoLibraryAddUsageDescription"字段

内容的提问来源于stack exchange,提问作者Felipe Peña

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:34