React 使用Upload插件上傳讀取文件內(nèi)容

問(wèn)題背景

某一天,公司里需要一個(gè)功能,一個(gè)可以把一份參數(shù)多如牛毛的配置文件本地存儲(chǔ)下來(lái)餐塘,本地也可以把文件讀取出來(lái)這樣便利的功能。分析一下這個(gè)需求皂吮,主要就是要以json的格式戒傻,保存,和web頁(yè)面讀取json文件的這樣兩個(gè)功能蜂筹。公司的工程是react編寫(xiě)的需纳,可能對(duì)vue和原生js都有一定了解的你,對(duì)react并不熟悉艺挪,那么候齿,如何解決這個(gè)問(wèn)題

分步解決

一、保存JSON格式的文件

首先闺属,我們假定拿到了一個(gè)json格式的變量

var jsonData;

那么慌盯,再寫(xiě)一個(gè)download的工具類

/* 
 * 下載文件
 * */
function download(content, filename) {
    // 創(chuàng)建隱藏的可下載鏈接
    var eleLink = document.createElement('a');
    eleLink.download = filename;
    eleLink.style.display = 'none';
    // 字符內(nèi)容轉(zhuǎn)變成blob地址
    var blob = new Blob([content]);
    eleLink.href = URL.createObjectURL(blob);
    // 觸發(fā)點(diǎn)擊
    document.body.appendChild(eleLink);
    eleLink.click();
    // 然后移除
    document.body.removeChild(eleLink);
}

發(fā)現(xiàn)問(wèn)題!直接download下來(lái)的是沒(méi)有格式化過(guò)的文本掂器,亂成一團(tuán)亚皂,毫無(wú)可讀性可言。一個(gè)formatjson非常重要国瓮!

/* 
 * 格式化json文件灭必,便于json文件的下載
 * */
function formatJson(json, options) {
    var reg = null,
        formatted = '',
        pad = 0,
        PADDING = '    ';
    options = options || {};
    options.newlineAfterColonIfBeforeBraceOrBracket = (options.newlineAfterColonIfBeforeBraceOrBracket === true) ? true : false;
    options.spaceAfterColon = (options.spaceAfterColon === false) ? false : true;
    if (typeof json !== 'string') {
        json = JSON.stringify(json);
    } else {
        json = JSON.parse(json);
        json = JSON.stringify(json);
    }
    reg = /([\{\}])/g;
    json = json.replace(reg, '\r\n$1\r\n');
    reg = /([\[\]])/g;
    json = json.replace(reg, '\r\n$1\r\n');
    reg = /(\,)/g;
    json = json.replace(reg, '$1\r\n');
    reg = /(\r\n\r\n)/g;
    json = json.replace(reg, '\r\n');
    reg = /\r\n\,/g;
    json = json.replace(reg, ',');
    if (!options.newlineAfterColonIfBeforeBraceOrBracket) {
        reg = /\:\r\n\{/g;
        json = json.replace(reg, ':{');
        reg = /\:\r\n\[/g;
        json = json.replace(reg, ':[');
    }
    if (options.spaceAfterColon) {
        reg = /\:/g;
        json = json.replace(reg, ':');
    }
    (json.split('\r\n')).forEach(function (node, index) {
        var i = 0,
            indent = 0,
            padding = '';
        if (node.match(/\{$/) || node.match(/\[$/)) {
            indent = 1;
        } else if (node.match(/\}/) || node.match(/\]/)) {
            if (pad !== 0) {
                pad -= 1;
            }
        } else {
            indent = 0;
        }
        for (i = 0; i < pad; i++) {
            padding += PADDING;
        }
        formatted += padding + node + '\r\n';
        pad += indent;
    });
    return formatted;
}

一行調(diào)用狞谱!

download(formatJson(jsonData), "configuration.json");

二、讀取JSON格式的文件

react有很多輪子禁漓,upload當(dāng)然也有相應(yīng)封裝好的工具跟衅,引入!
(在這之前別忘了npm install react-fileupload -save)

import FileUpload from 'react-fileupload'

寫(xiě)一份配置文件播歼,這個(gè)文件中寫(xiě)出的API這邊有http://www.reibang.com/p/3aa9d5ad41b0

this.options = {
            baseUrl: 'https://jsonplaceholder.typicode.com/posts/',
            param: {
                _c: 'file',
                _a: 'UploadFile'
            },
            chooseFile: this.chooseFile,
            doUpload: this.do_upload,
            uploading: (progress) => { this.uploading(progress); },
            uploadSuccess: this.upload_success,
            uploadError: this.upload_error,
            uploadFail: this.upload_fail,
        }

操作在那邊已經(jīng)很清晰啦伶跷,我就不多說(shuō)了

<FileUpload options={this.options}>
          <button ref="chooseBtn">Chose file</button> &nbsp;&nbsp;&nbsp;
          <button ref="uploadBtn">upload</button>
</FileUpload>

拿到文件之后,當(dāng)然要把文件內(nèi)容在web上就解析出來(lái)

var self = this;
var reader = new FileReader();
reader.readAsText(files[0]);
reader.onload = function () {
    console.log($.parseJSON(reader.result));
    var fileContent = $.parseJSON(reader.result)
}

好啦秘狞,fileContent就是里面的內(nèi)容叭莫,json對(duì)象,拿到之后烁试,就可以為所欲為了雇初!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市减响,隨后出現(xiàn)的幾起案子靖诗,更是在濱河造成了極大的恐慌,老刑警劉巖支示,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊橘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悼院,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)咒循,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)据途,“玉大人,你說(shuō)我怎么就攤上這事叙甸∮币剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵裆蒸,是天一觀的道長(zhǎng)熔萧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)僚祷,這世上最難降的妖魔是什么佛致? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮辙谜,結(jié)果婚禮上俺榆,老公的妹妹穿的比我還像新娘。我一直安慰自己装哆,他們只是感情好罐脊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布定嗓。 她就那樣靜靜地躺著,像睡著了一般萍桌。 火紅的嫁衣襯著肌膚如雪宵溅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天上炎,我揣著相機(jī)與錄音恃逻,去河邊找鬼。 笑死反症,一個(gè)胖子當(dāng)著我的面吹牛辛块,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铅碍,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼润绵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了胞谈?” 一聲冷哼從身側(cè)響起尘盼,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烦绳,沒(méi)想到半個(gè)月后卿捎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡径密,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年午阵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片享扔。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡底桂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惧眠,到底是詐尸還是另有隱情籽懦,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布氛魁,位于F島的核電站暮顺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秀存。R本人自食惡果不足惜捶码,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望或链。 院中可真熱鬧宙项,春花似錦、人聲如沸株扛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至盆繁,卻和暖如春掀淘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背油昂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工革娄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冕碟。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓拦惋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親安寺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厕妖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容