

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

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

[code]

    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
    
[/code]

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

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

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

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

* * *

**バージョン：**

[code]

    Phonegap Buiid : 7.1.0
    Android : 5.0.1
    cordova-plugin-file : 6.0.1
    cordova-plugin-file-transfer : 1.7.1
    
[/code]

* * *

**ソースコード：**

[code]

    //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");
    }
    
[/code]


CC BY-SA 4.0
2018-07-06T06:00:48.610
45356
2023-01-13T04:07:10.847
2018-07-06T07:38:17.797
19110
26865
question
android cordova
cordova-plugin-file-transferを使うと、Androidでファイル送信が0バイトになってしまう。


私は下記差分でうまく動いています。  
javascriptではなくtypescriptですが、同じプラグインを使用して似たようなことをやっているようなので、参考までに。  
この中のどれかが、解決の糸口になれば幸いです。

・プラグインのバージョンを変更してみる

[code]

    cordova-plugin-file 4.3.3 "File"
    cordova-plugin-file-transfer 1.6.3 "File Transfer"
    
[/code]

・cordova androidのバージョンを変更してみる

[code]

    cordova platform add android@7.1
    
[/code]

・ファイルをbase64にエンコードして送ってみる  
・サーバーへの送信をXMLHttpRequest等で試してみる


CC BY-SA 4.0
2018-07-26T09:27:29.350
46991
2018-07-26T09:27:29.350
29367
45356
answer