JavaScript、文件和Blob对象

JavaScript、文件和Blob对象,javascript,file,blob,document,Javascript,File,Blob,Document,因为我正在开发Flickr界面,所以我有一个问题链接。虽然我不是像PHP、C++、java等语言开发代码那样新,但是在课堂上我必须错过一些东西,因为我不明白该怎么做,或者更重要的是如何思考。 当我从桌面上传文件时,可以通过上传时使用的输入访问文件,但是实际的文件数据在哪里?当我使用下面的方法获取数据时,我得到了一个包含一些细节的文件对象,但是原始数据丢失了。为什么? function processUpload(event) { "use strict"; var contai

因为我正在开发Flickr界面,所以我有一个问题链接。虽然我不是像PHP、C++、java等语言开发代码那样新,但是在课堂上我必须错过一些东西,因为我不明白该怎么做,或者更重要的是如何思考。
  • 当我从桌面上传文件时,可以通过上传时使用的输入访问文件,但是实际的文件数据在哪里?当我使用下面的方法获取数据时,我得到了一个包含一些细节的文件对象,但是原始数据丢失了。为什么?

    function processUpload(event) {
        "use strict";
    
        var container = document.getElementById("imageContainer"),
            data = event.target.files,
            file = null,
            i = null;
    
        while (container.childNodes.length > 0) {
            container.removeChild(container.childNodes[0]);
        }
        for (i = 0; file = data[i]; i++) {
            if (!file.type.match('image.*')) {
                continue;
            }
            files.push(file);
        }
        loadImages();
    }
    
  • 在我当前的Flickr界面代码中,我可以从他们的提要加载数据并获得图像,但这些图像与我从桌面加载的图像类型不同。要使用这些数据创建文件对象,我在JavaScript代码中执行以下操作。我是jQuery的新手,不能原谅这一混乱。如何更新下面的代码,使其创建与图像相同类型的文件对象,就像从桌面上传一样?也许现在这并不重要,但在我继续使用这个Flickr界面之前,我希望它们是相同类型的

    function fetchImages() {
        var blob = [
            new Blob([], {}), [], new Uint16Array([32])
        ];
    
        $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", {
            tagmode: "any",
            format: "json",
        }, function (data) {
            for (var i = 0; data.items.length; i++) {
                files.push(new File(blob, data.items[i].media.m, {
                    type: 'image/jpeg'
                }));
                if (i === data.items.length - 1) {
                    loadImages();
                }
            }
        });
    }
    
  • 下面是FileReader代码。有人能解释一下这段代码背后的逻辑吗?它是可以工作的,但我在JavaScript方面没有那么丰富的经验?为什么文件数组中的数据会给出两次

    var reader = new FileReader();
    reader.onload = (function (file) {
        return function (f) {
            // do something with the image...
            // f.target.result gets the value used for the src attribute
            // what do I need to do here to convert it into a File object that is equal to a typical file upload?
        };
    }) (files[i]); // why?
    reader.readAsDataURL(files[i]); // why again?
    
  • 谢谢大家!

    问候
    Richard

    文件对象类似于对实际文件的引用。使用
    FileReader()
    获取实际数据,或使用
    URL.createObjectURL()
    将实际数据转换为URL。请注意,由于
    文件
    s是“refs”,使用操作系统修改打开的文件将实时更新
    文件
    对象的详细信息,您可以重新读取
    文件
    以获取新的文件数据,而无需重新获取(通过浏览器或dnd)链接。我相信正是这种“刷新”打开的对象的能力,迫使初始文件在采集时没有实际的二进制数据。请尝试以下回答:我以前确实使用过FileReader(检查上面的内容),但现在如何将其转换为文件对象,就好像它是上载一样?谢谢你们两位的帮助!:)文件对象类似于对实际文件的引用。使用
    FileReader()
    获取实际数据,或使用
    URL.createObjectURL()
    将实际数据转换为URL。请注意,由于
    文件
    s是“refs”,使用操作系统修改打开的文件将实时更新
    文件
    对象的详细信息,您可以重新读取
    文件
    以获取新的文件数据,而无需重新获取(通过浏览器或dnd)链接。我相信正是这种“刷新”打开的对象的能力,迫使初始文件在采集时没有实际的二进制数据。请尝试以下回答:我以前确实使用过FileReader(检查上面的内容),但现在如何将其转换为文件对象,就好像它是上载一样?谢谢你们两位的帮助!:)