cordova问题之VueAPP项目使用cordova插件实现文件/图片下载功能

一、问题

 VueAPP 中有一个文件下载功能,用了各种方法来实现下载功能,app 都没有反应。

JS 实现 html 页面点击下载文件

这个博客里面几乎包含了我试过的大部分方法,发现 PC 端没问题,手机不可以。

二、经过

这些方法 PC 端没问题,安卓就不行,问了一个接触过安卓的后台小伙伴,说是需要用 app 调起浏览器,让手机自带的浏览器下载文件。

这种方法对于安卓来说很是友好,前端暂时没发现可以调用的方法。。

三、结果

使用 cordova 下载文件的插件,通过获取安卓写入权限,再调用文件传输、打开文件等 cordova 插件,来实现 VueAPP 下载文件/图片的功能

cordova 的安装这里就不写了,官网和 w3c 很多详细的步骤
下载文件所需 cordova 插件:

在这里插入图片描述
cordova-plugin-android-permissions:获取权限的插件,相关文章推荐
cordova-plugin-file:用于操作用户设备上的本机文件系统,w3c有教程
cordova-plugin-file-transfer:用于上传和下载文件,具体看教程
cordova-plugin-file-opener2:打开文件系统插件

四、vue 调用 cordova 的具体方法

首先,在 vue 项目中添加 npm 依赖包
npm install --save vue-cordova
下载完成后,在 main.js 里面引入插件

在这里插入图片描述
在这里插入图片描述

然后,在 main.js 里面引入调用 cordova 插件具体功能的代码,方便全局调用

在这里插入图片描述

// cordovaPlugins.js CODE
//接口封装 -- 简单的封装下,用于测试功能是否ok
// 设备信息
function appGetLocation(result) {
  cordovaDevice()

  function cordovaDevice() {
    console.log("Cordova version: " + device.cordova + "\n" +
      "Device model: " + device.model + "\n" +
      "Device platform: " + device.platform + "\n" +
      "Device UUID: " + device.uuid + "\n" +
      "Device version: " + device.version);
    return {
      "Device model: ": device.model,
      "Device version: ": device.version
    }
  }

}

// 下载文件 txt,doc,jpg
function downloadFileHH(URL, NAME) {
  // 下载路径
  let url = "http://221.2.140.133:8999/" + URL;
  url = encodeURI(url)
  let filename = NAME; // 文件名
  //APP下载存放的路径,可以使用cordova file插件进行相关配置
  var targetPath = cordova.file.externalRootDirectory + filename;

  var fileTransfer = new FileTransfer();

  fileTransfer.download(
    url, targetPath, function(entry) {
      console.log("download complete: " + entry.toURL());
      // 打开文件系统插件,打开下载下来的APP
      cordova.plugins.fileOpener2.open(
        targetPath,
        'application/vnd.android.package-archive',
        {
          error:function(e){
            alert('Error status: ' + e.status + ' - Error message: ' + e.message);
          },
          success:function(){
            alert('下载成功!');
          }
        }
      );

    },

    function(error) {
      console.log(error)
      console.log("download error source " + error.source);
      alert("download error target " + error.target);
      console.log("download error code" + error.code);
    },

    false, {
      headers: {
        "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
      }
    }
  );
}


// 检查权限
function checkedPermiss(url, name) {
  var permissions = cordova.plugins.permissions;
  //校验app是否有安卓写入权限
  permissions.checkPermission(permissions.WRITE_EXTERNAL_STORAGE, function(s) {
    //hasPermission 验证是否成功
    if (!s.hasPermission) {
      //没有权限
      var errorCallback = function() {
        alert('没有存储权限!');
        // alert('Storage permission is not turned on');
      }
      //app申请写入权限
      permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, function(s) {
        if (s.hasPermission) {
          //申请成功后,下载文件
          downloadFileHH(url, name);
        }
        else {
          //申请失败,给予提示
          errorCallback();
        }
      }, function(error) {
        console.log(error, 'error...')
      });
    } else {
      //拥有权限,下载文件
      downloadFileHH(url, name);
    }
  }, function(error) {
    console.log(error, 'error......')
  });

}

// 返回在vue模板中的调用接口
export default {
  cordovaGetLocation: function (res) {
    return appGetLocation(res)
  },
  downloadFileHH: function (url, name) {
    return checkedPermiss(url, name)
  }
}
具体调用,在 vue 组件中,eg:

在这里插入图片描述
在这里插入图片描述

五、最后

在文件下载时,可能遇见各种bug,如:

第一调用下载功能,只下载了文件相关的插件,调用后报 Permission denied
cordova之File Transfer (Permission denied) 权限导致下载失败

还有些问题,可能是插件版本更新后,方法有变动,可以参考官方文档

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你可以尝试使用以下步骤来实现Cordova 环境下打包 Vue 项目并调用拍照功能: 1. 在 Cordova 项目根目录下执行以下命令安装 Cordova 插件 Camera: ``` cordova plugin add cordova-plugin-camera ``` 2. 在 Vue 项目中安装 Cordova 插件 Camera 的 TypeScript 类型: ``` npm install --save-dev @types/cordova-plugin-camera ``` 3. 在 Vue 项目的入口文件 main.ts 中添加以下代码: ``` declare var navigator: any; const app = createApp(App); app.config.globalProperties.$takePicture = () => { return new Promise((resolve, reject) => { navigator.camera.getPicture((imageData: string) => { resolve(`data:image/jpeg;base64,${imageData}`); }, (error: any) => { reject(error); }, { quality: 50, destinationType: navigator.camera.DestinationType.DATA_URL }); }); }; app.mount('#app'); ``` 上述代码会将 Cordova 的 Camera 插件添加到 Vue 的全局属性中,以便在 Vue 组件中调用。 4. 在 Vue 组件中调用 `$takePicture` 方法: ``` <template> <div> <button @click="takePicture">Take Picture</button> <img :src="image" v-if="image" /> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const image = ref(''); const takePicture = async () => { try { const imageData = await (window as any).$takePicture(); image.value = imageData; } catch (error) { console.error(error); } }; return { image, takePicture, }; }, }); </script> ``` 上述代码会在 Vue 组件中定义 `$takePicture` 方法的调用,在用户点击“Take Picture”按钮时调用该方法。调用成功后,图片的 base64 编码会被设置到 Vue 组件的 `image` 变量中,并渲染到页面上。 以上是一个简单的实现,在实际开发中你可能需要进行更多的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值