当前位置: 首页 > 知识库问答 >
问题:

前端 - uniapp 获取本地上传路径失败?

燕禄
2025-01-14

下图
红色框里面的文件获取都会返回空“”
绿色框里面文件与红色框一样,就可以返回本地路径
这是权限的问题吗?
可以解决吗?
uniapp+本地打包
1736837670752.jpg


export const  openFileManager = ()=> {
  return new Promise(async (resolve, reject) => {
    try {
      await requestPermission();
 
  
      const main = plus.android.runtimeMainActivity();
      
  
      const Intent = plus.android.importClass('android.content.Intent');
    
      const intent = new Intent(Intent.ACTION_GET_CONTENT);
 
      intent.addCategory(Intent.CATEGORY_OPENABLE);

      intent.setType('*/*');

      intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
 
      const REQUEST_CODE = 1;
 
      main.onActivityResult = (requestCode, code, data) => {
  
        const Activity = plus.android.importClass('android.app.Activity');
        plus.android.importClass('android.net.Uri');
       

        let filePathList = [];

        if (code === Activity.RESULT_OK && requestCode === REQUEST_CODE) {
         
          let Uri = data.getData();
 
          if (!Uri) {
            let ClipData = plus.android.importClass('android.content.ClipData');
            let clipData = new ClipData();
            clipData = data.getClipData();
 
            if (clipData) {
             
              const count = clipData.getItemCount();
              for (let i = 0; i < count; i++) {
                const item = clipData.getItemAt(i);
                const uri = item.getUri();
                const filePath = getFilePath(main, uri);
                filePathList.push(filePath);
              }
            }
          } else {
            filePathList.push(getFilePath(main, Uri));
          }
        }
 
        resolve(filePathList);
 

      };
 
      main.startActivityForResult(intent, REQUEST_CODE); 
    } catch (e) {
      reject(e);
    }
  });
}
 

function getFilePath(main, Uri) {
  const Build = plus.android.importClass('android.os.Build');
  const DocumentsContract = plus.android.importClass('android.provider.DocumentsContract');

  const IS_DOUMENT_TYPE = DocumentsContract.isDocumentUri(main, Uri);
  const scheme = Uri.getScheme();
  

  
  const IS_KITKAT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
  

  if (IS_KITKAT) {
    if (IS_DOUMENT_TYPE) {
  
      const docId = DocumentsContract.getDocumentId(Uri);
      const [type, id] = docId.split(':');
 
  
      const authority = Uri.getAuthority();
      
 
      const AUTHORITY_DOCUMENT_TYPE = {
        MEDIA: 'com.android.providers.media.documents',
        DOWNLOAD: 'com.android.providers.downloads.documents',
        EXTERNAL: 'com.android.externalstorage.documents',
      };
 
      const authorityFn = {
        [AUTHORITY_DOCUMENT_TYPE.DOWNLOAD]: getDownloadDocument,
        [AUTHORITY_DOCUMENT_TYPE.MEDIA]: getMediaDocument,
        [AUTHORITY_DOCUMENT_TYPE.EXTERNAL]: getExternalDocument,
      };
      return authorityFn[authority]?.({ main, Uri, docId, type, id });
    } else if (scheme === 'content') {
   
      
      return getDataColumn(main, Uri);
    } else if (scheme === 'file') {
      return Uri.getPath();
    }
  } else {
  
    const MediaStore = plus.android.importClass('android.provider.MediaStore');
    const columns = [MediaStore.Images.Media.DATA];
    const cursor = contentResolver.query(Uri, columns, null, null, null);
    if (cursor !== null && cursor.moveToFirst()) {
      const column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
      const filePath = cursor.getString(column_index);
      cursor.close();
      return filePath;
    }
  }
}
 

function getExternalDocument(options) {
  const { type, id } = options;
  const Environment = plus.android.importClass('android.os.Environment');
 
  let path = '';
  if (type === 'primary') {
    path = `${Environment.getExternalStorageDirectory()}/${id}`;
  } else {
    const System = plus.android.importClass('java.lang.System');
    path = `${System.getenv('SECONDARY_STORAGE')}/${id}`;
  }
  return path;
}

function getMediaDocument(options) {
  const { main, id, type } = options;
  const MediaStore = plus.android.importClass('android.provider.MediaStore');
  const MEDIA_TYPE = {
    image: MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    video: MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
    audio: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
    document: MediaStore.Files.getContentUri('external'),
  };
 
  const uri = MEDIA_TYPE[type] || null;
  return getDataColumn(main, uri, '_id=?', [id]);
}

function getDownloadDocument(options) {
  const { main, Uri, id } = options;
 
  if (id) {
    return id;
  }
 
  const ContentUris = plus.android.importClass('android.content.ContentUris');

  const originId = Uri.parse('content://downloads/public_downloads');
  const newId = ContentUris.parseId(Uri);
  const uri = ContentUris.withAppendedId(originId, newId);
  return getDataColumn(main, uri);
}
 

function getDataColumn(context, uri, selection = null, selectionArgs = null) {

  plus.android.importClass(context.getContentResolver());
 
  const _columns = ['_data'];

  const Cursor = context.getContentResolver().query(uri, _columns, selection, selectionArgs, null);
 

  Cursor && plus.android.importClass(Cursor);
 
  let filePath = '';
 
  if (Cursor !== null && Cursor.moveToFirst()) {

    const columnIndex = Cursor.getColumnIndexOrThrow(_columns[0]);

    filePath = Cursor.getString(columnIndex);

    Cursor.close();
  }
  return filePath;
}
 
const PERMISSION_TYPE = {

  PERMISSION_GRANTED: 0,

  PERMISSION_DENIED: 1,

  PERMISSION_DENIED_FOREVER: 2,
};
 

function requestPermission() {
  return new Promise((resolve, reject) => {
    plus.android.requestPermissions(
      ['android.permission.READ_EXTERNAL_STORAGE'],
      (e) => {
        if (e.deniedAlways.length > 0) {
       
          reject({
            code: PERMISSION_TYPE.PERMISSION_DENIED_FOREVER,
            msg: '未授权且不再询问',
          });
        }
        if (e.deniedPresent.length > 0) {
        
          reject({
            code: PERMISSION_TYPE.PERMISSION_DENIED,
            msg: '未授权',
          });
        }
        if (e.granted.length > 0) {
      
          resolve({
            code: PERMISSION_TYPE.PERMISSION_GRANTED,
            msg: '已授权',
          });
        }
      },
      (e) => {
        
        reject(e);
      }
    );
  });
}

·

共有1个答案

穆阳嘉
2025-01-14

回答

是的,这个问题很可能与权限有关,但也可能与文件选择的类型或URI处理方式有关。以下是一些可能的解决方案和检查点:

  1. 权限检查

    • 确保你的应用已经请求并获得了READ_EXTERNAL_STORAGE权限。
    • 如果应用目标SDK版本是Android 10(API级别29)及以上,还需要处理分区存储(Scoped Storage)的限制。
  2. 处理多文件选择

    • 你的代码已经处理了多文件选择(通过ClipData),但请确保在所有支持的Android版本和设备上都能正确工作。
    • 检查ClipDataUri的处理逻辑,确保没有遗漏或错误。
  3. URI处理

    • 对于不同类型的URI(如content://file://和文档URI),你的代码已经进行了不同的处理。
    • 确保所有URI类型都能被正确处理,并且没有遗漏的URI类型。
  4. Android版本兼容性

    • 不同的Android版本可能对文件访问有不同的限制和要求。
    • 确保你的代码能够兼容目标SDK版本以下的Android版本。
  5. 调试和日志

    • 在关键位置添加日志输出,以便跟踪和调试代码的执行流程。
    • 检查是否有异常或错误被抛出,并处理这些异常。
  6. 文件管理器应用

    • 某些文件管理器应用可能不遵循标准的文件访问API,导致你的代码无法正确获取文件路径。
    • 尝试使用不同的文件管理器应用来测试文件选择功能。
  7. 更新uni-app和依赖库

    • 确保你使用的uni-app和所有相关依赖库都是最新版本,以获取最新的功能和修复。

如果以上方法都不能解决问题,你可能需要更深入地调试代码,或者考虑使用其他文件选择库来替代当前的实现。

 类似资料:
  • 本文向大家介绍IOS  开发获取本地图片路径及上传,包括了IOS  开发获取本地图片路径及上传的使用技巧和注意事项,需要的朋友参考一下 1、获取沙盒路径 2、读取数据的时候,直接从自己设置文件中读取出来就行了,例子如下:   顺便说一下设置的根目录的位置: 2,获取Documents目录路径的方法: 3,获取Caches目录路径的方法: 4,获取tmp目录路径的方法: 感谢阅读,希望能帮助到大家,

  • 问题内容: 在CSS中,任何图像路径都相对于CSS文件位置。 f.ex如果我放入CSS文件并使用类似 浏览器将查找有意义的图像。 是否可以在javascript中做同样的事情? F.ex如果我包括以下代码并将其放在其中: 找不到图片,因为浏览器使用HTML文件作为起点,而不是脚本位置。我希望能够像CSS一样使用脚本位置作为起点。 这可能吗? 问题答案: 按照上面的方法在DOM中搜索您自己的标记是可

  • 在实现持久底部栏时,当单击底部栏中的按钮时,需要恢复以前的路由。 单击底部栏中的按钮时,会保存其当前路线路径(/a/b/c ),并根据按钮的单击恢复先前保存的路线。 从概念上讲,用户会认为每个按钮都是一个工作区,其状态永远不会丢失(包括后退堆栈)。用户可以安全地从一个工作区切换到另一个工作区。 当路由重绕到根时,如何在Flutter中获取当前路由路径?

  • 如何使用react router v4获取当前路径? 我尝试了以下方法,但没有成功: 错误: 这是我的Routes.js文件:

  • 在此URL中: 我想抓,当然是在路由里面。这工作很棒: 但是我想访问任何路由之外的路径以及文件如下:

  • 问题内容: 我想以编程方式访问将包含在我的项目文件夹中的特定文件。有没有办法做到这一点?如果是这样,我将文件放在项目文件夹中的什么位置,获取文件路径的一些简单代码是什么? 问题答案: 将文件放在项目的根文件夹中。然后获取文件URL,路径和其他详细信息,如下所示: 编辑: 替代方法(如果文件在您的类路径中,例如,将文件放在“ src”文件夹中,并确保编译后将其移入“ bin”或“ classes”文

  • 我的Excel文件放到public下: 然后方法里调用下载: 控制台打印出来href是这样 : 下载的时候就报找不到文件 我觉得正常应该是这样才对: http://localhost:9102/static/fileTemplate.xlsx 这样就可以下载到本地文件。 不知道哪里出错了,求指教!

  • 本文向大家介绍JS获取当前脚本文件的绝对路径,包括了JS获取当前脚本文件的绝对路径的使用技巧和注意事项,需要的朋友参考一下  当写模块加载器时,获取当前脚本文件的绝对路径作为基础路径是必不可少的一步,下面我们一起来探讨一下这个问题吧! 一、各大浏览器的实现方式                  [a]. Chrome和FF  超简单的一句足矣! 这里利用了对象 document.currentSc