Cordova摄像头插件可能会扩大图像文件大小

Cordova摄像头插件可能会扩大图像文件大小,cordova,ionic-framework,cordova-plugins,Cordova,Ionic Framework,Cordova Plugins,(我的副本,但可能更适合这样做。) 我创建了一个Ionic应用程序,作为Drupal 8门户网站的补充服务。门户用户可以使用其web凭据登录到应用程序,并且他们的用户信息可以跨设备同步 其中一条信息是他们的个人资料图片。我已经设置好了它,用户可以从设备的照片库中选择一幅图像,将其设置为应用程序上的个人资料图片,然后应用程序将图像转换为blob并将其发布到门户网站,门户网站随后相应地对其进行更新 执行此操作的代码如下(改编自): $scope.getPhoto=function(){ getPic

(我的副本,但可能更适合这样做。)

我创建了一个Ionic应用程序,作为Drupal 8门户网站的补充服务。门户用户可以使用其web凭据登录到应用程序,并且他们的用户信息可以跨设备同步

其中一条信息是他们的个人资料图片。我已经设置好了它,用户可以从设备的照片库中选择一幅图像,将其设置为应用程序上的个人资料图片,然后应用程序将图像转换为blob并将其发布到门户网站,门户网站随后相应地对其进行更新

执行此操作的代码如下(改编自):

$scope.getPhoto=function(){
getPic=函数(类型){
函数picSuccess(imageURI){
resolveLocalFileSystemURL(imageURI,函数(finalURI){
savepic(finalURI.nativeURL);
},函数(err){
控制台日志(err);
});
}
navigator.camera.getPicture(picSuccess,picError,{quality:10,targetWidth:800,encodingType:0,correctOrientation:true,destinationType:navigator.camera.destinationType.FILE_URI,saveToPhotoAlbum:false,sourceType:type});
}
picError=函数(e){console.log(e);}
var photo_popup=$ionicPopup.show({
模板:“您想更改您的照片吗?”,
范围:$scope,
标题:“照片”,
cssClass:“照片弹出窗口”,
按钮:[
{text:'从库中选择',onTap:function(e){getPic(0);},
{文本:“取消”}
]
});
};
函数savepic(finalURI){
变量名称=finalURI.substr(finalURI.lastIndexOf('/')+1);
变量namePath=finalURI.substr(0,finalURI.lastIndexOf('/')+1);
var newPath=cordova.file.dataDirectory+name;
$cordovaFile.copyFile(名称路径、名称、cordova.file.dataDirectory、名称)。然后(函数(信息){
函数addFormData(){
d=$q.defer();
var getFileBlob=函数(url,cb){
var xhr=new XMLHttpRequest();
xhr.open(“GET”,url);
xhr.responseType=“blob”;
xhr.addEventListener('load',function(){
cb(xhr.响应);
}); 
xhr.send();
};
var blobToFile=函数(blob,名称){
blob.lastModifiedDate=新日期();
blob.name=名称;
返回斑点;
};
var getFileObject=函数(FilePathrUrl,cb){
getFileBlob(FilePathrUrl,函数(blob){
cb(blobToFile(blob,'output.jpg'));
}); 
};
getFileObject(新路径,函数(fileObject){
var dat=新FormData();
dat.append('file',fileObject);
append('text',JSON.stringify({“imagedate”:Date.now()}));
d、 解决(dat);
});
回报承诺;
}
addFormData().then(函数(dataform){
$http({method:'POST',url:'connector for portal service goes here',数据:dataform,头:{'Authorization':(auth头在别处定义),'Content Type':undefined},transformRequest:angular.identity})。然后(函数(结果){
//数据库逻辑
},功能(e){
控制台日志(e);
});
});
},函数(err){console.log(err);});
}
从功能上讲,这段代码是有效的。我遇到的问题是,设备上1.3 MB的映像有时会导致post请求超过8 MB。服务器无法接受如此大的post请求,并且门户端更新失败


我看到过类似的主题也有同样的问题,但接受的解决方案已经集成到我的代码中,并且仍然存在。我被难住了。有人知道为什么会发生这种情况吗?

我也有同样的问题。将
destinationType
FILE\u URI
更改为
NATIVE\u URI
为我解决了这个问题。文件大小没有增加,文件名也正确。

这是在iOS上发生的吗?Android?两者都有?可能是blob转换导致了大小的增加?为什么不使用cordova插件文件传输来上传图像呢?这是在iOS上发生的,对于Android,我使用不同的插件(cordova imagepicker)问题似乎没有发生。我已经做了一些测试,并使用文件传输插件上传,大小没有增加。来自分辨率为1936×2592的iPod touch的图像约为150KB。顺便说一句,如果不提供TargetLight,targetWidth不起作用。将两者都设置为800(它保持纵横比)将大小减少到20KB左右。因此问题不在相机插件上。
$scope.getPhoto = function() {

    getPic = function(type) {

        function picSuccess(imageURI) {
            window.resolveLocalFileSystemURL(imageURI, function(finalURI) {
                savepic(finalURI.nativeURL);
            }, function(err) {
                console.log(err);
            });
        }

        navigator.camera.getPicture(picSuccess, picError, {quality: 10, targetWidth: 800, encodingType: 0, correctOrientation: true, destinationType: navigator.camera.DestinationType.FILE_URI, saveToPhotoAlbum: false, sourceType: type});
    }

    picError = function(e) { console.log(e);}

    var photo_popup = $ionicPopup.show({ 
        template: "Would you like to change your photo?",
        scope: $scope,
        title: "Photo",
        cssClass: "photo-popup",
        buttons: [
            {text: '<b>Choose from gallery</b>', onTap: function(e) { getPic(0); },
            {text: "Cancel"}
        ]
    });
};

function savepic(finalURI) {
    var name = finalURI.substr(finalURI.lastIndexOf('/') + 1);
    var namePath = finalURI.substr(0, finalURI.lastIndexOf('/') + 1);
    var newPath = cordova.file.dataDirectory + name;
    $cordovaFile.copyFile(namePath, name, cordova.file.dataDirectory, name).then(function(info) {
        function addFormData() {
            d = $q.defer();
            var getFileBlob = function (url, cb) {
                var xhr = new XMLHttpRequest();
                xhr.open("GET", url);
                xhr.responseType = "blob";
                xhr.addEventListener('load', function() {
                    cb(xhr.response);
                }); 
                xhr.send();
            };

            var blobToFile = function (blob, name) {
                blob.lastModifiedDate = new Date();
                blob.name = name;
                return blob;
            };

            var getFileObject = function(filePathOrUrl, cb) {
                getFileBlob(filePathOrUrl, function (blob) {
                    cb(blobToFile(blob, 'output.jpg'));
                }); 
            };

            getFileObject(newPath, function (fileObject) {
                var dat = new FormData();
                dat.append('file', fileObject);
                dat.append('text', JSON.stringify({"imagedate": Date.now()}));
                d.resolve(dat);
            });
            return d.promise;
        }

        addFormData().then(function(dataform) {
            $http({method: 'POST', url: 'connector for portal service goes here', data: dataform, headers: {'Authorization': (auth header defined elsewhere), 'Content-Type': undefined}, transformRequest: angular.identity}).then(function(result) {
                //database logic
            }, function(e) {
                console.log(e);
            });
        });
    }, function(err) { console.log(err); });
}