質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Android

    6743questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Cordova

    441questions

    Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

【cordova】cordova-plugin-file-transferを使うと、Androidでファイル送信が0バイトになってしまう。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 131

K_Endo

score 7

cordovaでcordova-plugin-file-transferを使って、
写真をサーバーへアップロードるするAndroidアプリを作成しています。

わたくしの後述のコードでは、下記のconsole logが出力されます。

Successful file write...
fileURL : file:///data/data/com.adobe.phonegap.app/cache/.Pic.jpg%3F1530809009472
Successful upload...
fileEntry.fullPath = /.Pic.jpg?1530809009472
Code = 200
response = 
bytesSent = 0

このログより、Androidからサーバーへのアクセスは成功しているようですが、
ファイルの転送が0バイト、つまり転送されていないようです。

また、サーバー側では、ファイルは保存されていますが
サイズが0バイトとなっていました。

どなたか、解決策が分かる方、ご回答よろしくお願い致します。

また、他に必要な情報がありましたら、ご指摘お願い致します。


バージョン:

Phonegap Buiid : 7.1.0
Android : 5.0.1
cordova-plugin-file : 6.0.1
cordova-plugin-file-transfer : 1.7.1

ソースコード:

//select and upload picture
$(document).on("click", ".pic-button", function() {
    openFilePicker();
});

function openFilePicker(selection) {
    var srcType = Camera.PictureSourceType.SAVEDPHOTOALBUM;
    var options = setOptions(srcType);

    if (selection == "picker-thmb") {
        // To downscale a selected image,
        // Camera.EncodingType (e.g., JPEG) must match the selected image type.
        options.targetHeight = 100;
        options.targetWidth = 100;
    }

    navigator.camera.getPicture(function cameraSuccess(imageUri) {

        // Do something with image
        console.log("get picture");
        console.log("imageUri : "+imageUri);

        image_uri = imageUri;
        URItoFileEntry(imageUri);
        onUploadFile(imageUri);

    }, function cameraError(error) {
        //console.debug("Unable to obtain picture: " + error, "app");
        console.log("Unable to obtain picture: " + error, "app");

    }, options);
}

function setOptions(srcType) {
    var options = {
        // Some common settings are 20, 50, and 100
        quality: 50,
        destinationType: Camera.DestinationType.FILE_URI,
        // In this app, dynamically set the picture source, Camera or photo gallery
        sourceType: srcType,
        encodingType: Camera.EncodingType.JPEG,
        mediaType: Camera.MediaType.PICTURE,
        allowEdit: true,
        correctOrientation: true  //Corrects Android orientation quirks
    }
    return options;
}

function URItoFileEntry(imageURI) {
    console.log("URItoFileEntry");
    window.resolveLocalFileSystemURL(imageURI, fileEntryToArrayBuffer, onError);
}

function fileEntryToArrayBuffer(fileEntry) {
    console.log("fileEntryToArrayBuffer");
    console.log(fileEntry.name);

    file_entry_name = image_uri.substr(image_uri.lastIndexOf('/') + 1);


    fileEntry.file( function(file) {
        console.log("fileEntry.file");

        var reader = new FileReader();

        reader.onloadend = ArrayBufferToBlob;

        reader.readAsArrayBuffer(file);

    }, onError2);
}

function ArrayBufferToBlob(event) {
    console.log("ArrayBufferToBlob");

    blob = new Blob([event.target.result], { type: "image/jpeg" });

    console.log("blob.size : "+blob.size);
    console.log("blob.type : "+blob.type);
}

function onError() {
    console.log("onError");
}

function onError2() {
    console.log("onError2");
}


function onUploadFile(imageUri) {
    console.log("onUploadFile");
    console.log("imageUri : "+imageUri);

    window.requestFileSystem(window.TEMPORARY, 5 * 1024 * 1024, function (fs) {

        console.log('file system open: ' + fs.name);
        var dirEntry = fs.root;

        console.log("imageUri : "+imageUri);

        dirEntry.getFile(imageUri, { create: true, exclusive: false }, function (fileEntry) {

            console.log("fileEntry name");
            console.log(fileEntry.name);

            // Write something to the file before uploading it.
            console.log("writeFile");
            writeFile(fileEntry);

        }, onErrorCreateFile);

    }, onErrorLoadFs);

    console.log("onUploadFile end");
}

function writeFile(fileEntry, dataObj) {
    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function (fileWriter) {

        fileWriter.onwriteend = function () {
            console.log("Successful file write...");

            upload(fileEntry);
        };

        fileWriter.onerror = function (e) {
            console.log("Failed file write: " + e.toString());
            console.log(e.toString());
        };

        if (!dataObj) {
            if(blob == undefined) {
                console.log("blob undefined");
            } else {
                console.log("blob defined");

                dataObj = blob;
            }
        }

        fileWriter.write(dataObj);
    }, failCreateWriter);
}

function failCreateWriter(error) {
    console.log(error.code);
}

function upload(fileEntry) {
    // !! Assumes variable fileURL contains a valid URL to a text file on the device,
    var fileURL = fileEntry.toURL();

    var success = function (r) {
        console.log("Successful upload...");
        console.log("fileEntry.fullPath = " + fileEntry.fullPath);
        console.log("Code = " + r.responseCode);
        console.log("response = " + r.response);
        console.log("bytesSent = " + r.bytesSent);
    }

    var fail = function (error) {
        ons.notification.alert("An error has occurred: Code = " + error.code);
    }

    function displayFileData(data){
        console.log("displayFileData");
        //ons.notification.alert(data);
    }

    var options = new FileUploadOptions();
    options.chunkedMode = false;
    options.fileKey = "file";
    options.fileName = file_entry_name;
    options.mimeType = "image/jpeg";

    var params = {};
    params.value1 = "test";
    params.value2 = "param";

    options.params = params;

    console.log("fileURL : "+fileURL);

    var ft = new FileTransfer();
    // SERVER must be a URL that can handle the request, like
    // http://some.server.com/upload.php
    var url_post_image = "http://some.server.com/upload.php";
    ft.upload(fileURL, encodeURI(url_post_image), success, fail, options);
};

function onErrorLoadFs() {
    console.log("onErrorLoadFs");
}

function onErrorCreateFile() {
    console.log("onErrorCreateFile");
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • Android

    6743questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Cordova

    441questions

    Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。