不涉及前后端交互,由前端数据生成文件并下载和上传文件前端解析的过程。

目录

一、由前端数据生成文件并下载

1. 函数编写

2. 使用方法

二、上传文件并解析

 1. 函数编写

2. 使用方法

总结


一、由前端数据生成文件并下载

1. 函数编写

由JS代码生成一个<a>标签元素。设置元素的href和download属性,为函数传入参数的文件内容和文件名,并设置元素为不可见,以消除对前端界面的视觉影响。

将元素加入body,并模拟其点击事件,即下载一个内容为fileContent、名字为fileName的文件。并在点击事件后移除元素。

// 下载文件,文件名为fileName,文件内容为fileContent
function downloadFile(fileName, fileContent) {
    let element = document.createElement('a');
    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContent));
    element.setAttribute('download', fileName);
    element.style.display = 'none';
    document.body.appendChild(element);

    element.click();

    document.body.removeChild(element);
}

2. 使用方法

可以在JS代码的任意执行时刻,动态传入参数实现文件的下载。如实现点击按钮下载文件的功能,则可以在按钮的点击事件中调用函数。

$('#button').onclick = function() {
        downloadFile('Hello.txt', 'Hello World!');
    }

二、上传文件并解析

1. 函数编写

由JS代码生成一个<input>标签元素。设置元素的type属性为file,以,并设置元素为不可见。将元素加入body,并模拟其点击事件。其会唤醒一个文件上传对话框,用户可以手动选择需要上传解析的文件。

设置元素的onchange属性,在元素内容改变时,执行以下代码:

  • 若元素内容为空,则直接返回;
  • 若元素内容非空,且有上传文件,则创建一个FileReader,对文件内容进行读取。读取出的内容以字符串形式,由函数的传入参数也即对文件内容进行操作的回调函数进行处理。
// 上传文件,弹出上传对话框,文件内容由uploadCallBackFunction回调函数处理
function uploadFile(uploadCallBackFunction) {
    let element = document.createElement('input');
    element.setAttribute('type', 'file');
    element.style.display = 'none';
    element.onchange = function (){
        if (this.value==='')
            return;
        if (this.files[0]){
            let reader = new FileReader();
            reader.readAsText(this.files[0], "UTF-8");
            reader.onload = function(evt){
                let file_string = evt.target.result;
                uploadCallBackFunction(file_string);
            }
        }
    }
    document.body.appendChild(element);

    element.click();

    document.body.removeChild(element);
}

2. 使用方法

由于上传文件并读文件解析的操作是异步性的(写在onchange函数中),函数无法通过返回值返回需要的文件内容。因此通过参数传入回调函数的方式,在读取文件内容后调用,对读取到的内容进行处理。

$('#button').onclick = function () {
        uploadFile(console.log);
    }

总结

使用纯前端的方式实现了文件的上传与下载。实际场景中,可以应用于一键导入导出前端页面保存的配置等;在支持不同文件格式时,可以使用前端解析的方式使数据格式统一,降低前后端交互过程的耦合性。