Javascript HTML5文件API中的FileReader.readAsText是如何工作的?

Javascript HTML5文件API中的FileReader.readAsText是如何工作的?,javascript,html,drag-and-drop,textarea,fileapi,Javascript,Html,Drag And Drop,Textarea,Fileapi,我使用HTML5文件API编写了以下代码来检查上传的文件是否存在 添加文档 FileReaderload事件异步设置.result值。要访问.result请使用load或loadend事件 当在选择文件或浏览…用户界面上选择文件时,删除本地文件系统中的文件不应影响调用返回的文件列表中的文件对象。见 每个快照都必须有一个内部的快照状态,该状态 最初必须设置为基础存储的状态(如果有) 这样的底层存储是存在的,必须通过 . 更多的规范性定义可参见s 这个猴子补丁将在适当的时候被移除。看 Bl

我使用HTML5文件API编写了以下代码来检查上传的文件是否存在


添加文档

FileReader
load
事件异步设置
.result
值。要访问
.result
请使用
load
loadend
事件

当在
选择文件
浏览…
用户界面上选择文件时,删除本地文件系统中的文件不应影响
调用返回的
文件列表
中的
文件
对象。见

每个快照都必须有一个内部的快照状态,该状态 最初必须设置为基础存储的状态(如果有) 这样的底层存储是存在的,必须通过 . 更多的规范性定义可参见s

这个猴子补丁将在适当的时候被移除。看

Blob
对象被删除

  • 给定targetRealm并忽略内存,每个
    Blob
    对象的[[]]内部方法必须运行以下步骤:

  • 如果是这样,那么抛出一个

  • 在targetRealm中返回此的新实例,对应于 相同的基础数据

    对象是

    给定每个
    文件列表
    对象的
    [[Clone]]
    内部方法 targetRealm和内存必须运行以下步骤:

  • 让输出为targetRealm中的新
    文件列表
    对象

  • 对于此中的每个文件,是否添加<将代码>[StructuredClone][15](\u文件、targetRealm、内存)
  • 添加到对象列表的末尾 产量

    返回输出


    在webkit和firefox浏览器上选择只读文件或文件夹

    在chrome上,chrome如果在本地文件系统中为文件设置了只读权限,并且用户选择了
    元素中的文件,其中
    文件阅读器
    用于读取文件,则会在
    文件阅读器
    上抛出一个错误,该错误由
    文件阅读器
    进度事件生成

    如果将
    Blob URL
    设置为同一文件对象,则
    Blob:
    URL不会根据请求将只读文件返回到
    Blob URL

    选择文件夹权限设置为只读的文件夹

    铬,铬 在chrome上,chrome设置了
    webkitdirectory
    属性,并以
    event.target.files的
    .length
    只读权限选择文件夹
    event.target.files.webkitGetAsEntry()
    未调用,
    “未选择任何文件”
    阴影DOM中呈现。当文件夹放置在
    或设置了
    可放置属性的元素处时,只读文件夹的目录
    .name
    .path
    将显示在
    放置
    事件中。数据传输

    当用户在
    元素处放置文件或文件夹时,在调用卸载之前,不会附加任何
    放置
    事件
    事件,并且在UI上显示prompr

    漏洞、安全问题 *尼克斯

    当用户在
    元素中删除文件夹时,如果没有附加
    删除
    事件,则会显示用户文件系统
    文件:
    协议中文件夹的完整路径。文件夹中包含的文件路径也未设置为
    .value
    ;e、 g

    "file:///home/user/Documents/Document/"
    
    当在
    元素中删除文件时,如果附加了not
    drop
    事件,则用户文件系统中文件的完整路径设置为
    .value
    of
    ;就是

    "file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue.txt"
    
    如果在
    元素中选择并删除多个文件,则所有完整文件路径都设置为
    .value
    ,由新行字符
    \n

    "file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue1.txt"
    "file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue2.txt"
    ..
    
    其中,为文件路径创建了一个
    XMLHttpRequest()
    ,并在
    控制台上记录错误

    NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
    
    当将
    元素的
    设置为
    .src
    .crossOrigin
    设置为
    “匿名”
    时,将调用
    img
    错误
    事件处理程序

    在调用
    window.open()
    时,在第一个参数处设置完整路径

    规范

    由于历史原因,IDL属性在 带有字符串“
    C:\fakepath\
    ”的文件名。一些遗留用户代理 实际上包含完整路径(这是一个安全漏洞)。 因此,从
    IDL获取文件名 属性以向后兼容的方式是非常重要的

    文件名

    获取时,它必须返回字符串“C:\fakepath\”,后跟列表中第一个文件的名称(如果有),或者如果列表为空,则返回空字符串。在…上 设置,如果新值为空字符串,则必须清空列表 所选文件的数量
    ;否则,它必须抛出一个“
    InvalidStateError
    DOMException

    注意:这一“伪造路径”要求是历史上的一次悲惨事故。有关更多信息,请参见状态部分中的示例 信息

    注意:由于
    所选文件列表中的文件名中不允许使用
    路径组件
    ,因此“
    \fakepath\
    ”不能出错 对于路径组件

    路径组件

    元素的
    类型
    属性位于
    文件上载中时
    声明,本节中的规则适用

    元素包含选定文件的列表
    , 每个文件包含一个文件名、一个文件名
    "file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue1.txt"
    "file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue2.txt"
    ..
    
    NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
    
    Error: Access to '"file:///home/user/Documents/Document/MyFileFullPathDisplayedAtTextAreaValue.png"' from script denied
    
    data:text/html,<textarea></textarea>
    
    <!DOCTYPE html>
    <html>
    
    <head>
      <style>
        body {
          height: 400px;
        }
    
        textarea {
          width: 95%;
          height: inherit;
        }
      </style>
    
      <script>
        window.onload = function() {
          var button = document.querySelector("#myfile + button");
          var input = document.getElementById("myfile");
          var display = document.getElementById("DisplayText");
          var text = null;
    
          function readFullPathToFileOnUserFileSystem(e) {
            var path = e.target.value;
            console.log(path);
            var w = window.open(path, "_blank");
            var img = new Image;
            img.crossOrigin = "anonymous";
            img.onload = function() {
              document.body.appendChild(this);
            }
            img.onerror = function(err) {
              console.log("img error", err.message)
            }
            img.src = path;
            var request = new XMLHttpRequest();
            request.open("GET", path.trim(), true);
            request.onload = function() {
              console.log(this.responseText)
            }
            request.error = function(err) {
              console.log(err.message)
            }
            request.send();
    
          }
    
          display.addEventListener("input", readFullPathToFileOnUserFileSystem);
          input.addEventListener("change", addDoc);
          input.addEventListener("progress", function(event) {
            console.log("progress", event)
          });
          button.addEventListener("click", handleText)
    
          function addDoc(event) {
            var mozResult = [];
    
            function mozReadDirectories(entries, path) {
              console.log("dir", entries, path);
              return [].reduce.call(entries, function(promise, entry) {
                  return promise.then(function() {
                    console.log("entry", entry);
                    return Promise.resolve(entry.getFilesAndDirectories() || entry)
                      .then(function(dir) {
                        console.log("dir getFilesAndDirectories", dir)
                        return dir
                      })
                  })
                }, Promise.resolve())
                .catch(function(err) {
                  console.log(err, err.message)
                })
                .then(function(items) {
                  console.log("items", items);
                  var dir = items.filter(function(folder) {
                    return folder instanceof Directory
                  });
                  var files = items.filter(function(file) {
                    return file instanceof File
                  });
                  if (files.length) {
                    console.log("files:", files, path);
                    mozResult = mozResult.concat.apply(mozResult, files);
    
                  }
                  if (dir.length) {
                    console.log(dir, dir[0] instanceof Directory, dir[0]);
                    return mozReadDirectories(dir, dir[0].path || path);
    
                  } else {
                    if (!dir.length) {
    
                      return Promise.resolve(mozResult).then(function(complete) {
                        return complete
                      })
    
                    }
                  }
    
                })
                .catch(function(err) {
                  console.log(err)
                })
    
            };
    
            console.log("files", event.target.files);
            if ("getFilesAndDirectories" in event.target) {
              return (event.type === "drop" ? event.dataTransfer : event.target)
              .getFilesAndDirectories()
                .then(function(dir) {
                  if (dir[0] instanceof Directory) {
                    console.log(dir)
                    return mozReadDirectories(dir, dir[0].path || path)
                      .then(function(complete) {
                        console.log("complete:", complete);
                        event.target.value = null;
                      });
                  } else {
                    if (dir[0] instanceof File && dir[0].size > 0) {
                      return Promise.resolve(dir)
                        .then(function(complete) {
                          console.log("complete:", complete);
                        })
                    } else {
                      if (dir[0].size == 0) {
                        throw new Error("could not process '" + dir[0].name + "' directory" + " at drop event at firefox, upload folders at 'Choose folder...' input");
                      }
                    }
                  }
                }).catch(function(err) {
                  console.log(err)
                })
            }
    
            var reader = new FileReader();
            reader.onload = function(e) {
              text = reader.result;
              console.log("FileReader.result", text);
              button.removeAttribute("disabled");
            }
    
            reader.onerror = function(err) {
              console.log(err, err.loaded, err.loaded === 0, file);
              button.removeAttribute("disabled");
            }
    
            reader.onprogress = function(e) {
              console.log(e, e.lengthComputable, e.loaded, e.total);
            }
    
            reader.readAsArrayBuffer(file);
    
          }
    
          function handleText() {
    
            // do stuff with `text`: `reader.result` from `addDoc`
            display.textContent = text;
            button.setAttribute("disabled", "disabled");
            // set `text` to `null` if not needed or referenced again
            text = null;
          }
        }
      </script>
    </head>
    
    <body>
      <input type="file" id="myfile" webkitdirectory directory allowdirs>
      <button type="button" disabled>Add Document</button>
      <br>
      <br>
      <textarea id="DisplayText"></textarea>
    </body>
    
    </html>
    
    instanceOfFileReader.readAsText(blob[, encoding]);