使用chrome文件系统toURL未显示图像

Image not showing using chrome filesystem toURL

本文关键字:显示 显示图 图像 toURL chrome 文件系统 使用      更新时间:2023-09-26

我有以下代码将图像写入文件系统,并读回以供显示。在尝试使用文件系统API之前,我将整个base64映像加载到src属性中,该映像显示良好。问题是图像可能很大,所以如果你添加几个5MB的图像,就会耗尽内存。所以我想我应该把它们写到tmp存储中,只把URL传递到src属性中。问题是,什么都没有显示。

起初我认为URL可能有问题,但后来我进入文件系统目录,找到了它所指的映像,并用实际的二进制映像对其进行了物理替换,并将其重命名为与替换的映像相同的映像。这很好,图像显示正确,所以URL看起来不错。

我能得出的唯一结论是,图像的书写在某种程度上是错误的,尤其是在创建斑点的地方。我浏览了blob API,看不到我可能遗漏的任何内容,但我显然做错了什么,因为它似乎对其他人都有效。

顺便说一句,我还尝试将图像存储在IndexedDB中,并使用createObjectURL来显示图像——同样,尽管URL看起来正确,但屏幕上什么都没有显示。因此,在文件系统API上进行了尝试。blob的创建在这两种情况下都是相同的,具有相同的数据。

正如我提到的,源数据是一个base64编码的字符串。是的,我也尝试将原始base64数据存储在blob中(有前缀和没有前缀),但这也不起作用。

其他信息-chrome版本28,在linux Ubuntu 上


    //strip the base64 `enter code here`stuff ...
    var regex = /^data.+;base64,/;
    if (regex.test(imgobj)) {   //its base64
        imgobj = imgobj.replace(regex,"");
        //imgobj = B64.decode(imgobj);
        imgobj = window.atob(imgobj);
    } else {
        console.log("it's already :", typeof imgobj);
    }
    // store the object into the tmp space
    window.requestFileSystem(window.TEMPORARY, 10*1024*1024, function(fs) {
        // check if the file already exists
        fs.root.getFile(imagename, {create: false}, function(fileEntry) {
            console.log("File exists: ", fileEntry);
            callback(fileEntry.toURL(), fileEntry.name);
                        //
        }, function (e) {   //file doesn't exist
            fs.root.getFile(imagename, {create: true}, function (fe) {
                console.log("file is: ", fe);
                fe.createWriter(function(fw){
                    fw.onwriteend = function(e) {
                        console.log("write complete: ", e);
                        console.log("size of file: ", e.total)
                        callback(fe.toURL(), fe.name);
                    };
                    fw.onerror = function(e) {
                        console.log("Write failed: ", e.toString());
                    };
                    var data = new Blob([imgobj], {type: "image/png"});
                    fw.write(data);
                }, fsErrorHandler);
            }, fsErrorHandler);
        });
        // now create a file
    }, fsErrorHandler);

回调的输出为:

<img class="imgx" src="filesystem:file:///temporary/closed-padlock.png" width="270px" height="270px" id="img1" data-imgname="closed-padlock.png">

除非有人能提供一些指导,否则我有点停滞不前。。。

更新

我运行了一个测试,用B64编码器/解码器和atob/btoa-对base64图像进行编码和解码

console.log(imgobj); // this is the original base64 file from the canvas.toDataURL function
/* B64 is broken*/
B64imgobjdecode = B64.decode(imgobj);
B64imgobjencode = B64.encode(B64imgobjdecode);
console.log(B64imgobjencode);
/* atob and btoa decodes and encodes correctly*/
atobimgobj = window.atob(imgobj);
btoaimgobj = window.btoa(atobimgobj);
console.log(btoaimgobj);

结果表明,btoa/atob函数可以正常工作,但B64不能正常工作——可能是因为原始编码没有使用B64编码函数。。。

在文件系统TEMPORARY中生成的文件中,我运行了一个在线base64编码器进行比较,结果完全不同。所以问题是,在文件系统临时存储中,映像应该是一个精确的映像,还是用只有文件系统API才能理解的"东西"填充?记住,我把原始PNG放在文件系统目录中,图像显示正确,这往往表明图像的元数据(例如文件名)保存在其他地方。。。

有工作实现的人能确认图像是作为图像存储在文件系统中,还是用额外的元数据填充吗?

因此,为了回答我自己的问题-核心问题是base64编码/解码-从那以后,我将其更改为使用ajax和responseTypes之类的东西,如arraybuffer和blob,一切都开始工作了。为了回答问题的最后一部分,这就是我所发现的——在文件系统tmp存储中,是的,该文件应该是一个精确的二进制副本——在chrome和phonegap中验证了这一点。