【问题标题】:sending base64 value of file to api将文件的base64值发送到api
【发布时间】:2021-05-26 16:04:20
【问题描述】:

我正在努力上传我想通过 PUT 请求保存的文件。 我用解决方案更新了问题

我有一个表单,允许在不同的字段中上传多个图像,但也可以在其他字段中上传字符串:

我遍历所有字段以收集 JSON 中的信息,然后将它们推送到我的 API:

keys 是一个带有 JSON 键名的字典(API 检查这些键),例如:name|STRprice|FLOATppic|IMG

$('#checkButton').on('click', function( event ) {
    let form = document.querySelector('#productForm');
    let nbr = document.querySelector('#productdata').getAttribute("pid")
    let return_dict = {"number": nbr};

    const pendings = ["name", "pic"].map(async function ( key ) {
        return_dict["name"] = form.elements[0].value;
        return_dict["pic"] = await img_2_b64(form.elements[1]);
    });
    Promise.all(pendings).then((values) => {
        write_2_DB_with_ajax_call ( return_dict )
    });
});

如果密钥将字段标识为 IMG,我想将其转换为 base64 并保存 - 这是我的解决方案:

function img_2_b64( element ) {
    return new Promise((resolve, reject) => {
        let file = element.files[0];
        let reader = new FileReader();
        reader.onloadend = function(e) {
            resolve(e.target.result);
        };
        reader.onerror = function() {
            reject();
        };
    reader.readAsDataURL(file);
    });

【问题讨论】:

  • 我认为你真的应该考虑切换到上传分段上传(使用formdata)或其他一些二进制协议,base64 + json 是个坏主意
  • 为什么 base64 和 json 是个坏主意?请您详细说明一下。
  • 1,浪费时间编码/解码。 2、体积较大。 3,向上/向下流格式错误,4. 不能很好地处理大文件(500mb+)。 5. 使用更多 RAM,6. 更多带宽成本
  • 我的垃圾是 kb 大小,但感谢您的输入。

标签: javascript asynchronous callback


【解决方案1】:

也许你可以使用 Promise 来更好地控制信息流:

$('#checkButton').on('click', function( event ) {
    let form = document.querySelector('#productForm');

    let return_dict = {"number": 0, "data": d};
    const pendings = keys.map(async function ( key ) {
        for ( let fe = 0; fe < form.elements.length; fe++ ) {
            if ( form.elements[fe].getAttribute("data-key") === key ) {
                if ( key.split("|")[1] === "IMG" ) {
                    d[key] = await img_2_b64(form.elements[fe]);
                } else {
                    d[key] = form.elements[fe].value;
                }
            };
        };
    });
   Promise.all(pendings)
    .then((values) => {
      write_2_DB_with_ajax_call ( values )
    });
  });

function img_2_b64( element ) {
  return new Promise((resolve, reject) => {
    let fileprops = "";
    let file = element.files[0];
    let reader = new FileReader();
    reader.onloadend = function() {
        resolve(reader.readAsDataURL(file));
    };
    reader.onerror = function() {
      reject();
    };
  })
}

【讨论】:

  • 不幸的是,Promise 中的代码永远不会被执行/没有返回。
  • 如果你更新你的代码(见我的)我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 2020-08-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
相关资源
最近更新 更多