Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5文件API读取为文本和二进制_Javascript_File_Html - Fatal编程技术网

Javascript HTML5文件API读取为文本和二进制

Javascript HTML5文件API读取为文本和二进制,javascript,file,html,Javascript,File,Html,我目前正在开发HTML5文件API,我需要获取二进制文件数据。 FileReader的readAsText和readAsDataURL方法工作正常,但readAsBinaryString返回的数据与readAsText相同 我需要二进制数据,但我得到一个文本字符串。我遗漏了什么吗?2018年的注意事项:readAsBinaryString已经过时。对于您以前使用过它的用例,现在您将使用(或在某些情况下使用)来代替 readAsBinaryString表示数据必须表示为,其中: …每个字节由[0

我目前正在开发HTML5文件API,我需要获取二进制文件数据。
FileReader
readAsText
readAsDataURL
方法工作正常,但
readAsBinaryString
返回的数据与
readAsText
相同


我需要二进制数据,但我得到一个文本字符串。我遗漏了什么吗?

2018年的注意事项:
readAsBinaryString
已经过时。对于您以前使用过它的用例,现在您将使用(或在某些情况下使用)来代替


readAsBinaryString
表示数据必须表示为,其中:

…每个字节由[0..255]范围内的整数表示

JavaScript最初没有“二进制”类型(直到ECMAScript 5的WebGL支持*(详情见下文)——它已被ECMAScript 2015取代),因此他们使用了字符串,并保证字符串中存储的字符不会超出范围0..255。(它们本可以用数字数组代替,但实际上没有;也许大字符串比大数组的内存效率更高,因为数字是浮点型的。)

如果您正在读取一个文件,其中大部分是西文脚本中的文本(例如,大部分是英文),那么该字符串将看起来非常像文本。如果读取包含Unicode字符的文件,您应该注意到一个差异,因为JavaScript字符串是**(详细信息如下),因此某些字符的值将超过255,而根据文件API规范,“二进制字符串”的值不会超过255(您将有两个单独的“字符”)用于Unicode代码点的两个字节)

如果您正在读取一个根本不是文本的文件(可能是一个图像),您可能仍然会在
readAsText
readAsBinaryString
之间得到一个非常相似的结果,但是使用
readAsBinaryString
您知道不会有任何尝试将多字节序列解释为字符。如果使用
readAsText
,您不知道这一点,因为
readAsText
将使用一个函数来尝试找出文件的编码,然后将其映射到JavaScript的UTF-16字符串

如果创建一个文件并将其存储在ASCII或UTF-8以外的其他格式中,则可以看到效果。(在Windows中,您可以通过记事本执行此操作;“另存为”作为一个带有“Unicode”的编码下拉列表,通过该下拉列表查看数据,它们似乎表示UTF-16;我相信Mac OS和*nix编辑器具有类似的功能。)下面是一个页面,该页面将以两种方式转储读取文件的结果:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show File Data</title>
<style type='text/css'>
body {
    font-family: sans-serif;
}
</style>
<script type='text/javascript'>

    function loadFile() {
        var input, file, fr;

        if (typeof window.FileReader !== 'function') {
            bodyAppend("p", "The file API isn't supported on this browser yet.");
            return;
        }

        input = document.getElementById('fileinput');
        if (!input) {
            bodyAppend("p", "Um, couldn't find the fileinput element.");
        }
        else if (!input.files) {
            bodyAppend("p", "This browser doesn't seem to support the `files` property of file inputs.");
        }
        else if (!input.files[0]) {
            bodyAppend("p", "Please select a file before clicking 'Load'");
        }
        else {
            file = input.files[0];
            fr = new FileReader();
            fr.onload = receivedText;
            fr.readAsText(file);
        }

        function receivedText() {
            showResult(fr, "Text");

            fr = new FileReader();
            fr.onload = receivedBinary;
            fr.readAsBinaryString(file);
        }

        function receivedBinary() {
            showResult(fr, "Binary");
        }
    }

    function showResult(fr, label) {
        var markup, result, n, aByte, byteStr;

        markup = [];
        result = fr.result;
        for (n = 0; n < result.length; ++n) {
            aByte = result.charCodeAt(n);
            byteStr = aByte.toString(16);
            if (byteStr.length < 2) {
                byteStr = "0" + byteStr;
            }
            markup.push(byteStr);
        }
        bodyAppend("p", label + " (" + result.length + "):");
        bodyAppend("pre", markup.join(" "));
    }

    function bodyAppend(tagName, innerHTML) {
        var elm;

        elm = document.createElement(tagName);
        elm.innerHTML = innerHTML;
        document.body.appendChild(elm);
    }

</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='fileinput'>
<input type='button' id='btnLoad' value='Load' onclick='loadFile();'>
</form>
</body>
</html>

显示文件数据
身体{
字体系列:无衬线;
}
函数loadFile(){
var输入,文件,fr;
if(typeof window.FileReader!=“函数”){
bodyAppend(“p”,“此浏览器尚不支持文件API”);
返回;
}
输入=document.getElementById('fileinput');
如果(!输入){
bodyAppend(“p”,“嗯,找不到fileinput元素”);
}
如果(!input.files){
bodyAppend(“p”,“此浏览器似乎不支持文件输入的`files`属性。”);
}
如果(!input.files[0]),则为else{
bodyAppend(“p”,“请在单击“加载”之前选择一个文件”);
}
否则{
file=input.files[0];
fr=新文件读取器();
fr.onload=接收到的文本;
fr.readAsText(文件);
}
函数receivedText(){
展示结果(fr,“文本”);
fr=新文件读取器();
fr.onload=一次接收;
fr.readAsBinaryString(文件);
}
函数receivedBinary(){
显示结果(fr,“二进制”);
}
}
函数显示结果(fr、标签){
var标记,结果,n,aByte,byteStr;
标记=[];
结果=fr.result;
对于(n=0;n
如果我将其与存储在UTF-16中的“Testing 1 2 3”文件一起使用,我会得到以下结果:

Text (13): 54 65 73 74 69 6e 67 20 31 20 32 20 33 Binary (28): ff fe 54 00 65 00 73 00 74 00 69 00 6e 00 67 00 20 00 31 00 20 00 32 00 20 00 33 00 案文(13): 54 65 73 74 69 6e 67 20 31 20 32 20 33 二进制(28): ff fe 54 00 65 00 73 00 74 00 69 00 6e 00 67 00 20 00 31 00 20 00 32 00 20 00 33 00 如您所见,
readAsText
解释了字符,因此我得到了13个字符(“Testing 1 2 3”的长度),而
readAsBinaryString
没有,因此我得到了28个字符(两个字节加上每个字符的两个字节)


*HTML 5支持使用
responseType=“arraybuffer”


**“JavaScript字符串是UTF-16”似乎是一个奇怪的语句;它们不只是Unicode吗?不,JavaScript字符串是;您将代理项对视为两个单独的JavaScript“字符”,尽管实际上,代理项对作为一个整体只是一个字符。有关详细信息,请参阅链接。

@digitalFresh:字符串是二进制数据。正如您所评论的,我发布了一个可能会有所帮助的示例。JavaScript没有“二进制”类型,因此他们使用字符串,并保证字符串中存储的字符不会超出范围0..255。(他们本来可以用一个数字数组代替,但他们没有。)这个例子展示了如何从字符串中获取“字符”的原始值。@morpheus:因为这个东西是异步的,所以它不能抛出异常;您需要查看接口,看看它是否以某种异步方式报告错误。实际上,
FileReader