如何将URL从URL保存到angularjs(离子)中的文件?

时间:2016-04-04 12:30:20

标签: javascript angularjs image ionic-framework

我有来自ng-src的base64data,但是我无法用这个base64data创建一个jpeg文件。我一直在尝试如下: 首先,我从data:image/jpeg:base64,中删除了data:image/jpeg:base64,/9/DEefesdfae453/sdDFEYEUdfdief8fe ...块,然后使用$cordovaFile将该数据写入test.jpg文件。这是我的代码:

        var base64Image = angular.element(document.querySelectorAll('#my-photo')).attr('src');

        var writeData = base64Image.replace(/data:image\/jpeg;base64,/g, '');

        alert(writeData);
        // Writing filtered image -----------------------------------------------------------------

        $cordovaFile.writeFile(ROOT_DIR + PM_DATA_DIR_NAME + '/', $scope.photo.name, writeData, true)
            .then(function (success) {
                // success
                $ionicLoading.hide();
                $ionicPopup.alert({
                    template : "Updated Photo!!"
                });
            }, function (error) {
                // error
                $ionicLoading.hide();
                $ionicPopup.alert({
                    template : "Failed to update Photo!!"
                });
            });

但是我无法将文件显示为图像文件。它只显示黑屏。 (原始文件大小:19K --->结果文件大小:66K)

怎么了? 请帮我。 谢谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

FileWriter的write方法不带base64字符串。根据文档(http://docs.phonegap.com/en/edge/cordova_file_file.md.html#FileWriter),文本在编写之前将被编码为UTF-8。因此,在写入文件之前,您的base64字符串正在被编码,因此它不是有效的图像数据。您必须将图像数据作为Blob或ArrayBuffer传递。请注意,这仅适用于iOS和Android。在这个答案中看看Jeremy Banks的b64toBlob函数:https://stackoverflow.com/a/16245768

function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;

var byteCharacters = atob(b64Data);
var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);
    var byteNumbers = new Array(slice.length);

    for (var i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i);
    }

    var byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);
}

var blob = new Blob(byteArrays, {type: contentType});
return blob;
}

您可以将生成的blob传递给write方法。