上传JSON文件并使用它

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2016-03-21
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2016-03-21 09:49

我如何上传一个JSON文件在我的网页上点击一个按钮说“导入”,并使用它存储在一个变量中使用和更新它使用JavaScript。

我已经翻阅了其他帖子,但没有找到任何答案。

我使用以下函数保存JSON变量:

function save(filename, data){
    if(!data) {
        alert('error : No data')
        return;
    if(typeof data === "object"){
        data = JSON.stringify(data, undefined, 4)
    var blob = new Blob([data], {type: 'text/json'}),
        e    = document.createEvent('MouseEvents'),
        a    = document.createElement('a')
    a.download = filename
    a.href = window.URL.createObjectURL(blob)
    a.dataset.downloadurl =  ['text/json', a.download, a.href].join(':')
    e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
    a.dispatchEvent(e)
 }

这是很好的工作,它下载文件点击另一个按钮,如“导出”。如何将此文件上传回并生成该文件数据的JSON变量?

浏览 15 关注 0 得票数 28
  • 得票数为Stack Overflow原文数据
原文
Stack Overflow用户
已采纳
修改于2016-03-24
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2016-03-24 10:58
得票数 38

没有服务器端代码,最好的方法可能是为用户提供一个 textarea 元素,以便将JSON复制/粘贴到其中,然后使用 JSON.parse 解析它。

您甚至可以使用像 Ace编辑器 这样的东西为JSON提供语法高亮显示--您可以在 王牌编辑厨房水槽演示 上看到它的作用--从左上角的下拉列表中选择JSON。

编辑:

结果我错了。下面是演示正在使用的FileReader的小提琴,这正是您所需要的:

https://jsfiddle.net/Ln37kqc0/

以下是代码:

Javascript:

document.getElementById('import').onclick = function() {
    var files = document.getElementById('selectFiles').files;
  console.log(files);
  if (files.length <= 0) {
    return false;
  var fr = new FileReader();
  fr.onload = function(e) { 
  console.log(e);
    var result = JSON.parse(e.target.result);
    var formatted = JSON.stringify(result, null, 2);
        document.getElementById('result').value = formatted;
  fr.readAsText(files.item(0));
};

HTML:

<input type="file" id="selectFiles" value="Import" /><br />
<button id="import">Import</button>
<textarea id="result"></textarea>
修改于2016-03-24
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2016-03-24 11:04
得票数 13

我有一种方法可以使用上传的json文件,下面是我找到的方法。

$("#inputFile").change(function(e) {
    onChange(e);
function onChange(event) {
    var reader = new FileReader();
    reader.onload = onReaderLoad;
    reader.readAsText(event.target.files[0]);
function onReaderLoad(event){
    //alert(event.target.result);
    var obj = JSON.parse(event.target.result);
    alert(obj);
}
操作
修改于2021-07-04
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2019-05-09 15:17
得票数 7

基本上传文件

    <input id="contentFile" type="file" accept="application/json" />

document.getElementById('contentFile').onchange =函数(Evt){尝试{ let文件= evt.target.files;if (!files.length) {警报(‘没有选择文件!’);返回;} let file =FileReader;让阅读器=新的FileReader();const = this;reader.onload =(事件) => {console.log(‘文件内容’,event.target.result);};reader.readAsText(文件);} catch (err) { console.error(err);}}

0
回答于2020-08-17
得票数 0

您可能要添加可拖动选项。

Firs创建HTML

<div class="drag" id="drag_area">
        <input class="box_file disabled" type="file" name="files[]" id="file" data-multiple-caption="{count} files selected" multiple />
        <label for="file"><strong>Choose save file</strong><span class="box__dragndrop"> or drag it here</span>.</label>
</div>

也不愿写出你的JS

$("#drag_area").on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {
    e.preventDefault();
    e.stopPropagation();
.on('dragover dragenter', function () {
    $("#drag_area").addClass('dr_active');
    // this is needed if you wish to style your drag area on drag events
.on('dragleave dragend drop', function () {
    $("#drag_area").removeClass('dr_active');
    // this is needed if you wish to style your drag area on drag events
.on('drop', function (e) {
    let droppedFiles = e.originalEvent.dataTransfer.files;
    let reader = new FileReader()
    reader.readAsDataURL(droppedFiles[0])
    reader.onloadend = function () {
    $.ajax({
        url: reader.result,
        success: function (data) {
          console.log(JSON.parse(data)); // This is your JSON
        error: function (request, error) {
            cliLog(2, "Upload", "Cant upload save file")
}),
修改于2020-09-02
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2020-09-02 02:26
得票数 2

试试这个,效果很好

handleUploadFile = async(doc) => {
  let file = doc.target.files[0]
  let reader = new FileReader(file)
  // await reader.readAsDataURL(file)
  reader.readAsText(file)
  reader.onload = async(e) => {
    let aaa = e.target.result
    let content = await JSON.parse(aaa)
    console.log(content)
}
回答于2021-04-20
得票数 0

我提出了一种更通用的方法,支持在加载完成时定制upload按钮标题和回调:

function uploadJson(id, callback) {
    document.getElementById(id).onchange = function(evt) {
        try {
            let files = evt.target.files;
            if (!files.length) {
                alert('No file selected!');
                return;
            let file = files[0];
            let reader = new FileReader();
            const self = this;
            reader.onload = (event) => {
                callback(event.target.result);
            reader.readAsText(file);
        } catch (err) {
            console.error(err);
uploadJson('importJson', function (json) {
    console.log(json);
});
<button onclick="document.getElementById('importJson').click()">import json</button>
<input id="importJson" value="import json" type="file" accept="application/json" style="" />
回答于2021-05-14
得票数 2

2021基于承诺的方法

正如前面提到的 这里 ,您可以使用更新的blob轻松地通过以下方法获得文件的值:

await blob.text()

const getJsonUpload = () =>
  new Promise(resolve => {
    const inputFileElement = document.createElement('input')
    inputFileElement.setAttribute('type', 'file')
    inputFileElement.setAttribute('multiple', 'true')
    inputFileElement.setAttribute('accept', '.json')
    inputFileElement.addEventListener(
      'change',
      async (event) => {
        const { files } = event.target
        if (!files) {
          return
        const filePromises = [...files].map(file => file.text())
        resolve(await Promise.all(filePromises))
      false,
    inputFileElement.click()
document.getElementById('upload-button').onclick = async () => {
    const jsonFiles = await getJsonUpload()
  console.log({jsonFiles})
}
<button id="upload-button">
Upload
</button>

回答于2022-03-30
得票数 1

使用更新的Blob,可以通过跳过 当前顶答 来简化 FileReader

document.getElementById('import').onclick = function() {
  var files = document.getElementById('selectFiles').files;
  console.log(files);
  if (files.length <= 0) {
    return false;
  files[0].text().then(function(text) {