【问题标题】:JavaScript Async readAsDataURL multiple filesJavaScript Async readAsDataURL 多个文件
【发布时间】:2013-04-11 23:17:43
【问题描述】:

我有一个需要保存的文件列表,除了名称之外,我还需要将 readAsDataURL 发送到服务器。

问题是我不确定如何使用 readAsDataURL 的异步特性来做到这一点。因为要将 DATAURL 保存到数组中,我需要查找文件列表中的文件名。而且我无法将文件传递给 readAsDataURL 的异步方法。你如何正确地写这个来工作?最终结果是我想要在一个 JSZip 文件中发送到服务器的文件列表。

function saveFileList(files)
{
    for (var i = 0, file; file = files[i]; i++) {

        var fr = new FileReader();
        fr.onload = function(e){
        if (e.target.readyState == FileReader.DONE) {
            var tt = e.target.result.split(",")[1];
                             //update the record in the list with the result
            }
         };

        var pp = fr.readAsDataURL(file);
  }

【问题讨论】:

  • 如果我的回答解决了您的问题,请将其标记为已接受。谢谢。

标签: javascript html file


【解决方案1】:

如果你有 FileList 并且你需要获取 base64 字符串数组,你需要这样做

export async function fileListToBase64(fileList) {
  // create function which return resolved promise
  // with data:base64 string
  function getBase64(file) {
    const reader = new FileReader()
    return new Promise(resolve => {
      reader.onload = ev => {
        resolve(ev.target.result)
      }
      reader.readAsDataURL(file)
    })
  }
  // here will be array of promisified functions
  const promises = []

  // loop through fileList with for loop
  for (let i = 0; i < fileList.length; i++) {
    promises.push(getBase64(fileList[i]))
  }

  // array with base64 strings
  return await Promise.all(promises)
}

这样使用

const arrayOfBase64 = await fileListToBase64(yourFileList)

【讨论】:

    【解决方案2】:

    你需要另一个函数,所以你可以把文件传入。试试这个:

    var reader = new FileReader();
    
    reader.onload = (function(theFile) {
       return function(e) {
          if(reader.readyState == FileReader.DONE)
             alert(theFile.name);   // The file that was passed in.
          }
       };
    })(file);
    
    reader.readAsDataURL(file);
    

    【讨论】:

      【解决方案3】:

      Russell G 答案的替代方案:

      var reader = new FileReader();
      reader.onload = function(event){
         payload = event.target.result;
         var filename = file.name, filetype = file.type;//etc
         //trigger a custom event or execute a callback here to send your data to server.
      };
      reader.onerror = function(event){
         //handle any error in here.
      };
      reader.readAsDataURL(file);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-20
        • 2021-04-26
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        相关资源
        最近更新 更多