ionic3 文件上传下载和预览

这次要讲的功能主要依赖于两个插件:
File TransferFile Opener

插件介绍

主要功能

  • File Transfer
    功能:文件上传、文件下载

  • File Opener
    功能:文件预览

支持的平台

平台名 File Transfer File Opener
Amazon Fire OS ×
Android
Browser ×
iOS
Ubuntu ×
Windows
Windows Phone 7 ×
Windows Phone 8

注:安卓最低支持到 4.4.4 版本

虽然支持的都挺多,不过既然是 ionic 项目,一会我们主要讨论 iOS 和 Android

安装方式

只作为 cordova 插件:

// File Transfer
$ cordova plugin add cordova-plugin-file-transfer

// File Opener
$ cordova plugin add cordova-plugin-file-opener2    

ionic 中使用:

// File Transfer
$ ionic cordova plugin add cordova-plugin-file-transfer
$ npm install --save @ionic-native/file-transfer

// File Opener
$ ionic cordova plugin add cordova-plugin-file-opener2
$ npm install --save @ionic-native/file-opener

为什么在 ionic 中安装有区别呢?
第一行:ionic 把 cli 从 cordova 改成了 ionic cordova
第二行:使用 npm 这个命令把包名保存在 package.json 中

官方地址

想去里面看 issue 查问题的需要注意一下,File Transfer 的 issue 已经关了,让去另一个网站提问。README.md 原话
Report issues with this plugin on the Apache Cordova issue tracker

使用方法

准备工作

上面两个安装好后。还需要使用安装另一个 File 插件,因为只用到了一句话,所以上面没把他列出来

$ ionic cordova plugin add cordova-plugin-file
$ npm install --save @ionic-native/file

都安装好后,把他们添加到 app.module.ts 的 providers

File Transfer 通用部分

import { FileTransfer, FileTransferObject, FileUploadOptions } from '@ionic-native/file-transfer';
import { File } from '@ionic-native/file';

constructor(
  ...
  private transfer: FileTransfer,
  private file: File,
  ...) {...}

File Transfer 上传文件

upload() {
  // ionic 官方文档例子漏写了这句话
  // http://ionicframework.com/docs/native/file-transfer/
  //
  const fileTransfer: FileTransferObject = this.transfer.create();
  // 更多的 Options 可以点进去自己看看,不懂的就谷歌翻译他的注释
  let options: FileUploadOptions = {
    fileKey: 'file',
    fileName: 'name.jpg',  // 文件类型
    headers: {},
    params: {}    // 如果要传参数,写这里
    .....
  }

  fileTransfer.upload('<file path>', '<api endpoint>', options)
  .then((data) => {
    // success
  }, (err) => {
    // error
  })
}

File Transfer 下载文件

先放出 ionic 官方文档例子。

download() {
  const url = 'http://www.example.com/file.pdf';
  fileTransfer.download(url, this.file.dataDirectory + 'file.pdf').then((entry) => {
    console.log('download complete: ' + entry.toURL());
  }, (error) => {
    // handle error
  });

这个 pdf 不知道为啥我一直下载失败,我去别的网站随便找个 pdf 或者项目上的文件下载一直成功,大家可以自己试试。

File Transfer 下载文件保存路径问题

这个保存路径,经过我测试 iOS 保存成功,安卓有的手机成功有的失败。检查了一下 AndroidManifest.xml 里的权限,权限代码也自动添加了

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

安卓 7.0 保存成功,4.4.4 和 5.3.3 都失败了。因为 Android 从 6.0 运行时的权限修改了,我不知道和这个有没有关系。暂时用了一个方法解决了问题,因为测试机有限,测的可能也不太完整,有问题请指出。

我判断了一下,如果是 iOS 或者 Android 6 及以上的版本,则保存路径使用

this.file.dataDirectory + 'file.pdf'

否则使用

'file:///storage/sdcard0/Download/' + 'file.pdf'

File Transfer 显示进度

直接复制这段代码。我做的项目,在下载的时候用了,感觉上传应该也能用。

// 进度
fileTransfer.onProgress(progressEvent => {
  if (progressEvent.lengthComputable) {
    // 下载过程会一直打印,完成的时候会显示 1
    console.log(progressEvent.loaded / progressEvent.total);
  } else {

  }
});

File Opener 预览文件(可配合文件下载使用)

import { FileOpener } from '@ionic-native/file-opener';

constructor(
  ...
  private fileOpener: FileOpener,
  ...) {...}

在文件下载成功的地方插入以下代码

// entry.nativeURL 是上面那个插件文件下载后的保存路径
this.fileOpener.open(entry.nativeURL, this.getFileMimeType(fileType))
  .then(() => {
    console.log('打开成功');
  })
  .catch(() => {
    console.log('打开失败');
  });

重点:
这里的第二个参数不是文件类型,而是 MIMEType

这个插件在 iOS 上好像不需要提供 MIME,我传错了也能预览,安卓是全军覆没了。这里提供一个代码里用到的取得 MIME 的方法

getFileMimeType(fileType: string): string {
  let mimeType: string = '';

  switch (fileType) {
    case 'txt':
      mimeType = 'text/plain';
      break;
    case 'docx':
      mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
      break;
    case 'doc':
      mimeType = 'application/msword';
      break;
    case 'pptx':
      mimeType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
      break;
    case 'ppt':
      mimeType = 'application/vnd.ms-powerpoint';
      break;
    case 'xlsx':
      mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
      break;
    case 'xls':
      mimeType = 'application/vnd.ms-excel';
      break;
    case 'zip':
      mimeType = 'application/x-zip-compressed';
      break;
    case 'rar':
      mimeType = 'application/octet-stream';
      break;
    case 'pdf':
      mimeType = 'application/pdf';
      break;
    case 'jpg':
      mimeType = 'image/jpeg';
      break;
    case 'png':
      mimeType = 'image/png';
      break;
    default:
      mimeType = 'application/' + fileType;
      break;
  }
  return mimeType;
}

获取文件类型的方法也给一个

// 刚开始造轮子的时候写的是 indexOf
// 后来果然出问题了,还是得判断最后一个 .
getFileType(fileName: string): string {
  return fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
}

文件预览的效果,在 iOS 上是直接调用了预览功能。安卓上是弹框选择打开软件,基本上 WPS Office 都能搞定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容