cordova-plugin-file-transferを使うと、Androidでファイル送信が0バイトになってしまう。
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");
}