1

phonegap (2.8.1) での FileWriter の奇妙な問題。filewriter を使用してファイルを書き込もうとすると、ファイルが作成されますが、ファイルの内容は {"type":"application/pdf","size":235577} という行だけです。どのファイルでも同じです。タイプとサイズは異なりますが、それがファイルに書き込まれる唯一のコンテンツです。

Chrome バージョン 28 を使用して同じコードを実行したところ、問題なく動作しましたが、WebKitBlobBuilder ではなく Blob を使用しています。そこで、WebKitBlobBuilder を使用する古いバージョンの Chromium (バージョン 20) をダウンロードしましたが、これも問題なく動作します。

私が何か奇妙なことをしていないかどうかを確認するために、ファイルを書き込もうとする前に (readAsDataURL を使用して) FileReader を使用してファイルの内容をダンプしました - 内容は問題ないようです。

そう...?

コードは次のとおりです。

function convert2blob(bin, type){
    // takes a BINARY or a BLOB input and returns a blob
    var blob;
    if (bin.size? true: false) {    
        console.log("its a blob already"); // do nothing??     Line 3494
        blob = bin;
    } else {
        var arr = new Uint8Array(bin.length);
        for (var i = 0; i < length; i++) {
            arr[i] = bin.charCodeAt(i)  & 0xff;
        }
        var bl = new window.BlobBuilder();
        bl.append(arr.buffer);
        blob = bl.getBlob(type);
    }
    return blob;
}


    blob = convert2blob(resx, attinfo.contenttype);
    console.log(blob.size);                             // Line 3543
    // just to verify the contents of the blob
    // tested with fileReader - contents are valid
    /* // just to check the file contents
    var rdr = new FileReader();
        rdr.onloadend = function(evt){
            console.log(evt.target.result.slice(0,128));
        };
    rdr.readAsDataURL(blob);
    */
    // its a blob - that's what we decided
    global.tmpFilesystem.root.getFile(attinfo.name, { create: true }, function (fileEntry) {
        console.log(fileEntry);
        fileEntry.createWriter(function (fileWriter) {
            console.log(fileWriter);
            fileWriter.onwriteend = function (e) {
                console.log(e.error);                   // Line 3582
                console.log("finished writing");        // Line 3583
                console.log(e.target.length);           // Line 3584
                runpopup(selectorid, fileEntry.toURL());
            };
            fileWriter.onerror = function(e) {
                console.log(e);
            };
            fileWriter.write(blob);
        }, function(e) {
            console.log(e);
        });
    }, function(e) {
        console.log(JSON.stringify(e));
    });

Logcat の出力は次のようになります。

I/Web Console(19696): {"encoding":null,"name":"005.jpg","fullPath":"005.jpg","contenttype":"image/jpeg"}:3521
I/Web Console(19696): /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEB:5236
I/Web Console(19696): 516857:5240
I/Web Console(19696): using WebKitBlobBuilder:5246
I/Web Console(19696): 516857:5250
// above few lines are after fetching from Websql DB

I/Web Console(19696): [object Blob]:3541
I/Web Console(19696): its a blob already:3494
I/Web Console(19696): 516857:3543
I/Web Console(19696): [object Object]:3560
I/Web Console(19696): [object Object]:3580
I/Web Console(19696): undefined:3582
I/Web Console(19696): finished writing:3583
I/Web Console(19696): 36:3584

ブラウザ出力で更新 ============ Chromium 20 からの同等の出力:

{"encoding":null,"fullPath":"closed-padlock.png","name":"closed-padlock.png","doc_id":"FE261266-B04C-48F3-8557-7FCF160E7F9F","contenttype":"image/png"}  - :3521
iVBORw0KGgoAAAANSUhEUgAAAS4AAAHXCAYAAAAC3beSAAAABmJLR0QA/wD/AP+gvaeTAAAXWElEQVR4nO3debDVdf3H8de9XJZAsACX1CwNwWVSGhfck2LMTEzDpazB  - :5236
6051  - :5240
using WebKitBlobBuilder  - :5246
6051  - :5250
Blob - :3541
its a blob already  - :3494
6051  - :3543
FileEntry - :3560
FileWriter - :3580
undefined  - :3582
finished writing  - :3583
6051  - :3584
filesystem:file:///temporary/closed-padlock.png 
4

1 に答える 1

2

したがって、コードは同じです。唯一の違いは、今日の午後に 2.8.1 から 3.0.0 にアップグレードし (問題を切り分けようとして、2.7、2.8、および 2.9 を介して)、FileWriter の問題がなくなったことです。ファイルは正しく書き込まれています。Simon のガイドは、プラグインを変換するのに非常に役立ちました - まだプラグインの問題が 1 つ残っていますが、それは大きな問題ではありません - すぐに解決できるはずです (私はそう思います)。結局、それはプラグインの問題ではなく、すべてがうまく機能していることが判明しました.

ところで-気づかなかった人のために、cordova.jsファイルを調べることは非常に有益です-base64コーデックがそこに組み込まれていることを発見しました-CouchDBコーデックとの互換性を願っています...

于 2013-08-02T07:50:08.587 に答える