@capacitor/filesystem更改downloadfile支持本地文件下载

news2024/11/26 23:44:09

ionic监听外部程序:

 android下需要在AndroidManifest.xml添加内容(具体参考ionic native的APP插件),配置例如:

 <intent-filter tools:ignore="AppLinkUrlError">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:mimeType="*/*" />
          </intent-filter>

ionic打开文件时的代码如下:

import { App } from '@capacitor/app';


App.addListener('appUrlOpen', (event) => {      
      const url = event.url;//android下url格式:content://com.android.fileexplorer.myprovider/external_files/test.txt
//拷贝url到Data目录下,用copy方式出错
//   Filesystem.copy({ from: readurl, to: 'test.txt', toDirectory: Directory.Data }).then(
      //     (v) => {
      //       this.files.push('copy:' + v.uri);
      //     }
      //   ).catch(
      //     (err) => {
      //       this.files.push('copy_error:' + err);
      //     }
      //   );
     });
//Filesystem.readFile可以读出内容,但是为字符串,用Filesystem.writeFile也只能写字符串,对于非文本文件无法操作

为了实现拷贝,更改代码,通过downloadFile函数来实现,主要就是读取文件流,然后写入。

android下:

用@capacitor/filesystem的copy函数时,如果拷贝为content://...的文件,会报错,copy不支持content://路径的文件。

修改downloadFile函数,支持本地文件(content://)的下载。

修改capacitor-filesystem的android代码下的Filesystem文件下的downloadFile函数,如下图:

更改后代码如下:

public JSObject downloadFile(PluginCall call, Bridge bridge, HttpRequestHandler.ProgressEmitter emitter)
        throws IOException, URISyntaxException, JSONException {
        String urlString = call.getString("url", "");
        JSObject headers = call.getObject("headers", new JSObject());
        JSObject params = call.getObject("params", new JSObject());
        Integer connectTimeout = call.getInt("connectTimeout");
        Integer readTimeout = call.getInt("readTimeout");
        Boolean disableRedirects = call.getBoolean("disableRedirects");
        Boolean shouldEncode = call.getBoolean("shouldEncodeUrlParams", true);
        Boolean progress = call.getBoolean("progress", false);

        String method = call.getString("method", "GET").toUpperCase(Locale.ROOT);
        String path = call.getString("path");
        String directory = call.getString("directory", Environment.DIRECTORY_DOWNLOADS);


        final File file = getFileObject(path, directory);
        InputStream connectionInputStream = null;
        String contentLength = null;
        try {
          connectionInputStream = getInputStream(urlString,null);
          contentLength = "1024";
        } catch (Exception e){}
        if (connectionInputStream == null) {
          final URL url = new URL(urlString);
          HttpRequestHandler.HttpURLConnectionBuilder connectionBuilder = new HttpRequestHandler.HttpURLConnectionBuilder()
            .setUrl(url)
            .setMethod(method)
            .setHeaders(headers)
            .setUrlParams(params, shouldEncode)
            .setConnectTimeout(connectTimeout)
            .setReadTimeout(readTimeout)
            .setDisableRedirects(disableRedirects)
            .openConnection();

          CapacitorHttpUrlConnection connection = connectionBuilder.build();

          connection.setSSLSocketFactory(bridge);

          connectionInputStream = connection.getInputStream();
          contentLength = connection.getHeaderField("content-length");
        }

          FileOutputStream fileOutputStream = new FileOutputStream(file, false);


          int bytes = 0;
          int maxBytes = 0;

        try {
            maxBytes = contentLength != null ? Integer.parseInt(contentLength) : 0;
        } catch (NumberFormatException ignored) {}

        byte[] buffer = new byte[1024];
        int len;

        // Throttle emitter to 100ms so it doesn't slow down app
        long lastEmitTime = System.currentTimeMillis();
        long minEmitIntervalMillis = 100;

        while ((len = connectionInputStream.read(buffer)) > 0) {
            fileOutputStream.write(buffer, 0, len);

            bytes += len;

            if (progress && null != emitter) {
                long currentTime = System.currentTimeMillis();
                if (currentTime - lastEmitTime > minEmitIntervalMillis) {
                    emitter.emit(bytes, maxBytes);
                    lastEmitTime = currentTime;
                }
            }
        }

        if (progress && null != emitter) {
            emitter.emit(bytes, maxBytes);
        }

        connectionInputStream.close();
        fileOutputStream.close();

        return new JSObject() {
            {
                put("path", file.getAbsolutePath());
            }
        };
    }

主要更改部分:

 

 更改后,就可以调用downloadfile下载本地文件(拷贝)了,如下所示:

Filesystem.downloadFile(
        {
          url: "content://com.android.fileexplorer.myprovider/external_files/test.txt",
          path: "text.txt",
          directory: Directory.Data,
          progress: true
        }
      )
      .then(
        (v) => {
          this.files.push('copy:' + v.path);
        }
      ).catch(
        (err) => {
          this.files.push('copy_error:' + err);
        }
      );

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/867430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Matlab智能算法】PSO优化(单隐层)BP神经网络算法

上一篇博客介绍了BP-GA&#xff1a;BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值&#xff0c;本篇博客将介绍用PSO&#xff08;粒子群优化算法&#xff09;优化BP神经网络。 1.优化思路 BP神经网络的隐藏节点通常由重复的前向传递和反向传播的方式来决定&#…

(统计学习方法|李航)第四章 朴素贝叶斯算法——贝叶斯估计

贝叶斯估计方法&#xff1a; 计算男女时只有两个值&#xff0c;所以K2 贝叶斯估计就是拉普拉斯平滑 估计方法&#xff1a;为什么叫做贝叶斯估计呢&#xff1f; 例题&#xff1a; 重新回顾以下朴素贝叶斯&#xff1a; 对他求导&#xff0c;求出最大值 得到了色i他的估计值&…

第三章:前端UI框架介绍

文章目录 一、Bootstrap1.1 Bootstrap简介及版本1.2 Bootstrap使用 二、AntDesign2.1 简介2.2 基本使用2.3 antd pro 三、ElementUI3.1 简介3.2 基本使用 四、Vant4.1 简介4.2 基本使用 一、Bootstrap 1.1 Bootstrap简介及版本 1、 简介 Bootstrap&#xff0c;来白 Twitter&a…

服务管理和计划任务

文章目录 服务管理计划任务 服务管理 systemctl 命令字 服务名 //配置服务与systemctl有关的命令字&#xff1a; 计划任务 一次性计划 at 时间 at now 5 min //当前时间五分钟后执行 at -l //列出计划任务 atrm 任务号 //删除计划任务执行完命令后Ctrld生效 周期性计…

LiveNVR监控流媒体Onvif/RTSP功能-视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例

LiveNVR视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例 1、介绍2、摄像头OSD设置水印3、前端页面叠加4、视频流水印4.1、图片水印示例4.2、时间戳水印示例 5、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、介绍 监控视频平台播放视频监控的时候&#xff0c;除了满足正…

提升效率!云原生生态从业人员不可或缺的工具集合!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

shell脚本安装nginx

文章目录 shell脚本原理变量脚本安装nginx shell脚本原理 以删除桌面文件的脚本为例&#xff0c;执行脚本后&#xff0c;shell脚本将代码给内核&#xff0c;内核读取后执行命令&#xff0c;如果shell脚本也在桌面上&#xff0c;执行后这个脚本文件也会被删除。 变量 echo $SH…

Java程序控制结构,一文带你彻底拿下~

—— 程序的运行流程控制会解决程序是如何执行的 三大程序流程控制结构 1&#xff09;顺序结构&#xff1a;程序从上到下逐行逐行的执行&#xff0c;中间没有任何的判断和跳转 2&#xff09;分支结构&#xff1a;程序具有选择性的进入某一段代码 3&#xff09;循环结构&#xf…

SQL Developer中的Data Redaction

SQL Developer中的Data Redaction用起来比命令行方便多了。可以选定表或视图&#xff0c;右键点击“遮盖保护”菜单。 但赋权方面有需要注意的地方。 假设Redact Admin是SYS&#xff0c;Redact User是HR。虽然SYS具备所有权限&#xff0c;但还是报以下错误。其实这个错误是针…

jvm——垃圾回收机制(GC)详解

开始之前有几个GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间…

spring常用注解标签总结

1&#xff1a;Component等 名称Component/Controller/Service/Repository类型类注解位置类定义上方作用设置该类为spring管理的bean属性value&#xff08;默认&#xff09;&#xff1a;定义bean的id 说明: Component注解如果不起名称&#xff0c;会有一个默认值就是当前类名首…

IDEA提示:StringBuffer xxx‘ may be declared as ‘StringBuilde

如图所示&#xff0c;编写代码时遇见了如下IDEA警告&#xff1a; 原因&#xff1a;StringBuilder是线程不安全的&#xff0c;但是其效率高&#xff0c;而StringBuffer则相反&#xff0c;虽然其线程安全&#xff0c;但是效率低下。 由于 StringBuilder 相较于 StringBuffer 有速…

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…

音视频研发分享:关键帧截图+wasm快照--我又做了一件有益于社会的事情

音视频研发分享&#xff1a;关键帧截图wasm快照--我又做了一件有益于社会的事情 简单的一个视频设备快照功能到底有多费事多费电&#xff1f;新的方法有方法&#xff01; 省了多少电&#xff1f; 简单的一个视频设备快照功能到底有多费事多费电&#xff1f; 以前&#xff0c;我…

【C# 基础精讲】构造函数和析构函数

构造函数&#xff08;Constructor&#xff09;和析构函数&#xff08;Destructor&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们分别用于在对象创建和销毁的时候执行特定的操作。这两个函数在C#以及其他面向对象编程语言中都具有重要的作用&#xff0c;用于初始化…

机器学习笔记:李宏毅chatgpt 大模型 大资料

1 大模型 1.1 大模型的顿悟时刻 Emergent Abilities of Large Language Models&#xff0c;Transactions on Machine Learning Research 2022 模型的效果不是随着模型参数量变多而慢慢变好&#xff0c;而是在某一个瞬间&#xff0c;模型“顿悟”了 这边举的一个例子是&#…

剪映:制作特效的常用方法

在创作短视频时&#xff0c;常常需要为一些镜头添加或制作特效&#xff0c;以增加趣味性、提升影片的艺术渲染力。本文介绍几种在剪映专业版中快速添加或制作特效的常用方法。 一、使用特效库 在“特效”库中提供了大量的特效供下载使用。找到自己中意的特效&#xff0c;直接拖…

alphassl便宜通配符SSL证书推荐

AlphaSSL是一家提供SSL证书的CA认证机构&#xff0c;其证书可以保护网站的安全性&#xff0c;防止黑客攻击和信息泄露。AlphaSSL的证书价格实惠&#xff0c;安全性高&#xff0c;AlphaSSL的证书还可以与各种服务器和网站平台兼容&#xff0c;包括Apache、IIS、Tomcat和Nginx等。…

【C# 基础精讲】类和对象的概念

在面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;中&#xff0c;类和对象是两个核心概念&#xff0c;用于描述和实现现实世界中的实体和关系。OOP 是一种编程范式&#xff0c;通过将数据和操作封装为对象来组织和管理代码&#xff0c;使得代…

大模型时代,如何重塑AI人才的培养?知名高校专家为您解答

当下&#xff0c;随着人工智能技术的快速发展&#xff0c;大模型已经成为了人工智能发展的新方向&#xff0c;同时也对新时代AI人才的需求和培养带来了新的思考与挑战&#xff0c;需要结合当下社会对复合型AI人才的需求进行新思考&#xff0c;创新AI人才培养模式&#xff0c;以…