cordova 7拍照 - >上传它 - >下载修改后的图片并存储在手机上(不是数据网址)

时间:2018-06-14 23:14:58

标签: cordova image-upload cordova-plugin-file cordova-plugin-camera

Cordova 7,cordova-plugin-file,cordova-plugin-file-transfer,cordova-plugin-camera。在cordova-simulate(微软)和现场设备(Oneplus 5T)上进行测试

因此,我正在开发一款应用,可让用户拍摄图像并将其发送到操作图像的Web服务,并将结果作为响应返回。 这主要是为了确保服务器上没有保存任何内容。

我无法理解整个文件系统的工作原理。我不太清楚如何翻译图像的路径以及它们不显示的原因。

我的应用内容政策:

<meta http-equiv="Content-Security-Policy" content="default-src * gap: file: blob: data: http: cdvfile: ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

我的JS代码:

function setImage(src){
    $('#picture').attr('src',src);
}

function generateImage(){
    fileURL = $('#picture').attr('src');
    var options = new FileUploadOptions();

    options.fileKey = "image";
    options.fileName="photo.jpg";
    options.mimeType="image/jpeg";
    options.chunkedMode = false;
    options.params = {somedata:$('#somdata').val()};

    var ft = new FileTransfer();
    ft.upload(fileURL, encodeURI("https://example.com/generate.php"), win, fail, options);
}

var fail = function(error) {
    // error.code == FileTransferError.ABORT_ERR
    alert("An error has occurred: Code = " + error.code);
    console.log("upload error source " + error.source);
    console.log("upload error target " + error.target);
    console.log(error);
}
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...");
            setImage(fileEntry.toURL());
        };

        fileWriter.onerror = function (e) {
            console.log("Failed file write: " + e.toString());
        };

        // If data object is not passed in,
        // create a new Blob instead.
        if (!dataObj) {
            dataObj = new Blob(dataObj, { type: 'image/png' });
        }

        fileWriter.write(dataObj);
    });
}

var win = function(r) {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {

        console.log('file system open: ' + fs.name);
        date = new Date();
        fs.root.getFile(date.getTime()+".png", { create: true, exclusive: false }, function (fileEntry) {

            console.log("fileEntry is file?" + fileEntry.isFile.toString());
            // fileEntry.name == 'someFile.txt'
            // fileEntry.fullPath == '/someFile.txt'
            writeFile(fileEntry, r.response);

        }, onErrorCreateFile);

    }, onErrorLoadFs);
    console.log("Should not be called.");
    console.log(r);
}
function camera_error(){
    console.log('camera error');
}
function camera_success(str){
    $('#picture').attr('src',str);
    window.resolveLocalFileSystemURI(str, function (fileEntry) {
        console.log("success: " + JSON.stringify(fileEntry));
    }, function (e) {
        console.log("error: " + JSON.stringify(e));
    });
}
function getPicture(type){
    if(type == 'library'){
        navigator.camera.getPicture(camera_success, camera_error,{
        sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
        encodingType: Camera.EncodingType.JPEG,
        destinationType: Camera.DestinationType.NATIVE_URI
        });
    } else {
        navigator.camera.getPicture(camera_success, camera_error,{
        encodingType: Camera.EncodingType.JPEG,
        destinationType: Camera.DestinationType.NATIVE_URI
        });
    }
}

因此,让我试着解释我想要做的事情。

  1. 您使用getPicture函数拍摄照片。
  2. 在成功映像之后,我们将该映像上传到Web服务,该服务获取上传的文件并以新的png文件进行响应。
  3. 我使用此响应的内容(响应有一个image / png标头并且是二进制的)将其保存到本地PERSISTENT文件系统
  4. 完成此操作后,我将其显示
  5. 以某种方式保存它不起作用。当我去Android设备上的文件系统时,图像就像404错误,即使我100%确定我有正确的文件名。

    我缺少什么?

    我无法在simuate或实际设备上使用它。

    请注意,您在上面看到的大部分代码都是从cordova文档中复制的。

    感谢。

0 个答案:

没有答案