开发者社区 问答 正文

OSS SDK通过文件的Uri上传文件,报错

OSS SDK通过文件的Uri上传文件,报错com.alibaba.sdk.android.oss.ClientException: No entry for content://media/external/audio/media/54511

展开
收起
1442619863847595 2021-11-02 18:57:32 1346 分享 版权
阿里云 AI 助理回答

遇到这个错误提示,意味着您在使用阿里云对象存储(OSS)SDK通过Android的Content URI上传文件时遇到了问题。错误信息No entry for content://media/external/audio/media/54511表明SDK尝试访问的文件URI无法直接被读取或转换为可以上传的数据流。

要解决这个问题,您可以按照以下步骤操作:

  1. 检查文件权限:确保您的应用拥有读取外部存储中文件的权限。在AndroidManifest.xml中添加如下权限声明(如果尚未添加):

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    对于Android 6.0(API级别23)及以上版本,还需要在运行时请求权限。

  2. 使用ContentResolver打开并读取文件:由于您是通过Content URI访问文件,需要使用ContentResolver来打开一个输入流,然后将这个输入流转给OSS SDK进行上传。示例如下:

    // 假设uri是您要上传的文件的Uri
    Uri fileUri = Uri.parse("content://media/external/audio/media/54511");
    
    try {
       ContentResolver resolver = context.getContentResolver();
       InputStream inputStream = resolver.openInputStream(fileUri);
    
       // 确保OSSClient已经初始化
       OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
       // 设置Object的名称,即上传到OSS后的文件名
       String objectName = "your_object_name";
    
       // 使用流式上传
       ossClient.putObject(new PutObjectRequest(bucketName, objectName, inputStream));
    
       // 关闭输入流
       inputStream.close();
    
       // 关闭OSSClient
       ossClient.shutdown();
    
    } catch (IOException e) {
       e.printStackTrace();
    } catch (ClientException ce) {
       ce.printStackTrace();
    }
    
  3. 处理大文件:如果文件较大,建议使用分块上传(ResumableUploadRequest)以提高上传的稳定性和效率。

请根据您的具体需求调整上述代码示例,并确保替换endpointaccessKeyIdaccessKeySecretbucketName以及your_object_name等占位符为实际的值。这样应该能帮助您解决报错问题,并成功上传文件至阿里云OSS。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答