首页 > 解决方案 > 嗨,是否可以使用 javascript/angularjs 和 ionic1 将 Blob/Base64 转换为 fileURI 格式。

问题描述

我正在尝试使用 cordovaCamera 和 imagePicker 捕获图像,然后删除 EXIF 数据并创建删除元数据后获得的图像副本。

在下面的代码中,我得到了 Blob 格式的图像文件,我将其传递给 resolveLocalFileSystemURL 但由于 resolveLocalFileSystemURL 不接受 blob 或 base64 数据而无法继续,因此可以将 Blob/Base64 转换为 fileURI 格式。或者有什么办法可以解决这个问题。

在 html 中: <input id="erd" type="file"/>

在 controllers.js 中:

var input = document.querySelector('#erd');
input.addEventListener('change', load);
function load(){
    var fr = new FileReader();
    fr.onload = process;
    fr.readAsArrayBuffer(this.files[0]);
    console.log(" onload "+URL.createObjectURL(this.files[0]));
}

function process(){
var dv = new DataView(this.result);
var offset = 0, recess = 0;
var pieces = [];
var i = 0;
if (dv.getUint16(offset) == 0xffd8){
    offset += 2;
    var app1 = dv.getUint16(offset);
    offset += 2;
    while (offset < dv.byteLength){
        if (app1 == 0xffe1){

            pieces[i] = {recess:recess,offset:offset-2};
            recess = offset + dv.getUint16(offset);
            i++;
        }
        else if (app1 == 0xffda){
            break;
        }
        offset += dv.getUint16(offset);
        var app1 = dv.getUint16(offset);
        offset += 2;
    }
    if (pieces.length > 0){
        var newPieces = [];
        pieces.forEach(function(v){
            newPieces.push(this.result.slice(v.recess, v.offset));
        }, this);
        newPieces.push(this.result.slice(recess));
        var br = new Blob(newPieces, {type: 'image/jpeg'});
        console.log(" pieces.length "+URL.createObjectURL(br));
        $scope.strimg=URL.createObjectURL(br).toString();
        //var file = new File(URL.createObjectURL(br), "uploaded_file.jpg", { type: "image/jpeg", lastModified: Date.now() });

        var myFile = blobToFile(br, "my-image.jpg"); 
        console.log('myFile'+JSON.stringify(myFile));
        $scope.strimg = myFile;
        createFileEntry($scope.strimg);
        }
    }
}
        function blobToFile(theBlob,fileName){ 
        console.log('theBlob'+theBlob+fileName);
        var b = theBlob; 
        b.lastModifiedDate = new Date(); 
        b.name = fileName; //Cast to a File() type 
        return theBlob; 
        }



    function createFileEntry(fileURI) {
        window.resolveLocalFileSystemURL(fileURI, copyFile, fail);
    }

    // 5
    function copyFile(fileEntry) {
    console.log(" copyFile "+fileEntry);
        var name = fileEntry.fullPath.substr(fileEntry.fullPath.lastIndexOf('/') + 1);
        var newName = name;

        $scope.filepathnew="file:///storage/emulated/0/Android/data/com.offermanagement.system/files/";

        window.resolveLocalFileSystemURL($scope.filepathnew, function(fileSystem2) {
                                        fileEntry.copyTo(
                                        fileSystem2,
                                        newName,
                                        onCopySuccess,
                                        fail
                                    );
                            },
                            fail);
    }

    function onCopySuccess(entry) {
        $scope.$apply(function () {
            $rootScope.profilepic=entry.nativeURL;
            $rootScope.images.push(entry.nativeURL);
            $rootScope.items.push({src:entry.nativeURL,sub:'' });

        });
    }

    function fail(error) {
        console.log("fail: " + error.code);
    }

对于上面的代码,我收到以下错误“Uncaught TypeError:resolveLocalFileSystemURI 的参数“uri”的错误类型:预期的字符串,但得到了 Blob。”

标签: javascriptangularjsionic-v1

解决方案


推荐阅读