ionic3 filechooser插件 小白踩坑歷程

本人是ionic框架的一名小白,之前用ionic3做項目官硝。項目做了一半之后停做了一段時間樊卓,現(xiàn)在繼續(xù)開始庶香。但是發(fā)現(xiàn),ionic已經(jīng)升級到了ionic4版本简识,但ionic4跟ionic3差別還挺大的,所以我還是選擇用熟悉的ionic3來接著做項目感猛。

最近七扰,身為小白的我在研究怎么在手機上選擇文件并且上傳,想到了兩個思路陪白,一個是用HTML上的:


<input class='file'></input>

這是HTML的經(jīng)典方法颈走,但是本人用這個方法獲取了文件之后就不會怎么上傳了。查了一下大佬的文章咱士,知道了ionic框架下有個專門的方法上傳立由,就是用filechooser插件獲取文件URL,然后用filetransfer來上傳序厉。具體方法參見這位大佬的文檔:

ionic文件上傳

這個文檔將過程寫的很清楚锐膜,但是本人實踐的時候,在filechooser這個插件上遇到了極大的難題: 按照官網(wǎng)文檔對這個插件的說明:

File Chooser - Ionic Documentation

在命令行的項目根目錄用


ionic cordova plugin add cordova-plugin-filechooser

npm install @ionic-native/file-chooser

然后在正文中用

import { FileChooser } from '@ionic-native/file-chooser/ngx';
//別忘了要在providers里面加上FileChooser弛房,后面的FileTransfer同理
constructor(private fileChooser: FileChooser) { }

...

this.fileChooser.open()
  .then(uri => console.log(uri))
  .catch(e => console.log(e));

uri就是文件在你手機上的絕對路徑道盏,然后借助FileTransfer實現(xiàn)上傳,要先插入啊文捶,聲明啊什么的跟filechooser是一樣的荷逞。下面是FileTransfer的相關(guān)代碼內(nèi)容:

options = {
    fileKey: 'file',
    fileName: 'name',
    params: {name: filename, type: filetype, model: 'file', author: global.username},
    headers: {}
}
var reqUri = APP_SERVE_URL + '/postimg';    // APP_SERVE_URL是服務(wù)器地址
const fileTransfer: FileTransferObject = this.transfer.create();
fileTransfer.upload(uri, reqUri, options).then((data) => {
    alert('上傳成功');
}, (err) => {
    alert('上傳失敗');
});

我照做了,然而我遇到了這樣的問題粹排,不知道各位有沒有:


Object(...) is not a function

發(fā)現(xiàn)是filechooser有問題种远。這個問題,困擾了我好久顽耳,難道是filechooser插件的具體內(nèi)容寫錯了嗎坠敷?不可能啊,這可是大神寫的啊斧抱。我猜應(yīng)該是版本問題常拓,現(xiàn)在我是ionic3的項目,但是ionic版本是ionic4辉浦,出點這個問題很可能是版本的問題弄抬。

后來我了解了一下插件的原理,發(fā)現(xiàn)問題出在.

\node_modules@ionic-native\file-chooser\ngx\index.js中:


import { Plugin, cordova, IonicNativePlugin } from '@ionic-native/core';

……

FileChooser.prototype.open = function () { return cordova(this, "open", {}, arguments); };
//就是這里cordova(this, "open", {}, arguments)是object(...)宪郊,因此報錯是這里

首先掂恕,這里的cordova是小寫的拖陆,然而在'@ionic-native/core'中只有Cordova,再有懊亡,調(diào)試后發(fā)現(xiàn)Object(...) is not a function說的的確是這里依啰。于是我就改了一下,然后又發(fā)現(xiàn)有好多其他問題……比如:


this.filechooser.open().then() i……s not a function

這里說明open函數(shù)的格式又有問題店枣。速警。。

最后鸯两,對比著FileOpener2的index.js文件的內(nèi)容闷旧,奮斗了好久,終于將這個官方實例實現(xiàn)了钧唐。奮斗過程很復雜忙灼,這里就不吐槽了,最后我改對了钝侠。

我只是改了\node_modules@ionic-native\file-chooser\ngx\index.js這個文件该园,現(xiàn)在發(fā)給各位分享一下,當然帅韧,可能有其他問題里初,各位發(fā)現(xiàn)的話記得私聊:

原來的代碼:

var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
import { IonicNativePlugin, cordova } from '@ionic-native/core';
var FileChooserOriginal = /** @class */ (function (_super) {
    __extends(FileChooserOriginal, _super);
    function FileChooserOriginal() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    FileChooserOriginal.prototype.open = function () { return cordova(this, "open", {}, arguments); };
    FileChooserOriginal.pluginName = "FileChooser";
    FileChooserOriginal.plugin = "cordova-plugin-filechooser";
    FileChooserOriginal.pluginRef = "fileChooser";
    FileChooserOriginal.repo = "https://github.com/ihadeed/cordova-filechooser";
    FileChooserOriginal.platforms = ["Android"];
    return FileChooserOriginal;
}(IonicNativePlugin));
var FileChooser = new FileChooserOriginal();
export { FileChooser };

現(xiàn)在改為:

var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Injectable } from '@angular/core';
import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
var FileChooser = /** @class */ (function (_super) {
    __extends(FileChooser, _super);
    function FileChooser() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    FileChooser.prototype.open = function () { return Cordova(this, "open", {}, arguments); };
    /*FileChooser.pluginName = "FileChooser";
    FileChooser.plugin = "cordova-plugin-filechooser";
    FileChooser.pluginRef = "fileChooser";
    FileChooser.repo = "https://github.com/ihadeed/cordova-filechooser";
    FileChooser.platforms = ["Android"];*/
    FileChooser.decorators = [
        { type: Injectable },
    ];
    FileChooser.ctorParameters = function () { return []; };
    __decorate([
        Cordova({
            callbackOrder: 'reverse'
        }),
        __metadata("design:type", Function),
        __metadata("design:paramtypes", []),
        __metadata("design:returntype", Promise)
    ], FileChooser.prototype, "open", null); 
    FileChooser = __decorate([
        Plugin({
            pluginName: 'FileChooser',
            plugin: 'cordova-plugin-filechooser',
            pluginRef: 'fileChooser',
            repo: ' https://github.com/ihadeed/cordova-filechooser',
            platforms: ['Android']
        })
    ], FileChooser);
    return FileChooser;
}(IonicNativePlugin));
export { FileChooser };

將文件替換一下,官方的實例就可以用了弱匪。

實際上青瀑,這應(yīng)該是個版本的問題,但是ionic4跟3的差別好像有點大萧诫,我不太想去看斥难,所以就在ionic3里面硬改了,如果有哪個道友跟我一樣懶帘饶,而且遇到了相同的問題哑诊,希望能幫助到大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末及刻,一起剝皮案震驚了整個濱河市镀裤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缴饭,老刑警劉巖暑劝,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颗搂,居然都是意外死亡担猛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傅联,“玉大人先改,你說我怎么就攤上這事≌糇撸” “怎么了仇奶?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長比驻。 經(jīng)常有香客問我该溯,道長,這世上最難降的妖魔是什么别惦? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任朗伶,我火速辦了婚禮,結(jié)果婚禮上步咪,老公的妹妹穿的比我還像新娘。我一直安慰自己益楼,他們只是感情好猾漫,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著感凤,像睡著了一般悯周。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陪竿,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天禽翼,我揣著相機與錄音,去河邊找鬼族跛。 笑死闰挡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的礁哄。 我是一名探鬼主播长酗,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桐绒!你這毒婦竟也來了夺脾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茉继,失蹤者是張志新(化名)和其女友劉穎咧叭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烁竭,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡菲茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片生均。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡听想,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出马胧,到底是詐尸還是另有隱情汉买,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布佩脊,位于F島的核電站蛙粘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏威彰。R本人自食惡果不足惜出牧,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歇盼。 院中可真熱鬧舔痕,春花似錦、人聲如沸豹缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邢笙。三九已至啸如,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氮惯,已是汗流浹背叮雳。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妇汗,地道東北人帘不。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像杨箭,于是被迫代替她去往敵國和親厌均。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355