1

我已经部分开发了一个混合 Android 应用程序,使用 node.js 为我的服务器和 javascript、jquery、phonegap(现在称为 cordova 1.6.0)为应用程序。

该应用程序的一部分允许用户使用智能手机相机拍照,然后将其上传到服务器。

我在上传图像的应用程序中的代码是......

    var imageURI = document.getElementById('display_image').src;
    if (!imageURI) { // || (self.elem.image_play.style.display == "none")) {
        console.log('no image uri defined - ' + JSON.stringify(imageURI));
        //document.getElementById('camera_status').innerHTML = "Take picture or select picture from library first.";
        return;
    }

    // Verify server has been entered
    server = 'http://192.168.1.3:8180/newimage/';
    if (server) {
        console.log("starting upload");
        // Specify transfer options
        var options = new FileUploadOptions();
        options.fileKey="file";
        options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
        options.mimeType="image/jpg";
        options.chunkedMode = false;

        // Transfer picture to server
        var ft = new FileTransfer();
        ft.upload(imageURI, server, function(r) {
            console.log("upload successful"+r.bytesSent+" bytes uploaded.");
            //document.getElementById('camera_status').innerHTML = "Upload successful: "+r.bytesSent+" bytes uploaded.";
        }, function(error) {
            console.log("upload failed - Error Code = "+error.code);
            //document.getElementById('camera_status').innerHTML = "Upload failed: Code = "+error.code;
        }, options);
    }

这很好用,但是我不知道如何处理 node.js 服务器上的图像。目前我的代码是:

'/newimage/': function(req,res){

    var chunks;

    req.addListener('data', function (chunk) {
        console.log('in data processing');
        chunks.push(chunk);
    });

    req.addListener('end', function () {
        console.log('completing data processing');
        fs.writeFile("out.jpg", chunks, function(err) {
            console.log(err);
        });
    });
}

此服务器方法执行,但 console.log 行都不执行。

我已经尝试了 2 天来解决这个问题,我尝试了许多不同的方法,但我无法弄清楚如何处理来自 phonegap ft.upload 方法的传入图像文件。有人可以帮忙吗?

完成排序后,我的最终目标是将图像文件上传到亚马逊 s3 存储,我想我可以使用 knox 模块。

4

1 回答 1

1

我正在使用 node formidable 和 fs 模块将上传的图像写入 nodejs 服务器上的 /tmp 文件夹,以便稍后进行 OCR。代码基于www.nodebeginner.org书中的图像上传示例。

我在 phonegap 项目中的 uploadPicture() 方法中的 JS 代码:

 // Specify transfer options
        var options = new FileUploadOptions();
        options.fileKey="file";
        options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
        options.mimeType="image/jpeg"
        options.chunkedMode = false;

        // Transfer picture to server
        var ft = new FileTransfer();
        ft.upload(imageURI, server, function(r) {
            document.getElementById('camera_status').innerHTML = "Upload successful: "+r.bytesSent+" bytes uploaded.";              
        }, function(error) {
            document.getElementById('camera_status').innerHTML = "Upload failed: Code = "+error.code;               
        }, options, true);

我在节点服务器上 requesthandler.js 中的代码:

function upload(response, request) {
    console.log("Request handler 'upload' was called.");
    var form = new formidable.IncomingForm();
    form.parse(request, function(error, fields, files) {

        //logs the file information 
        console.log(JSON.stringify(files))

        fs.rename(files.file.path, "/tmp/test.png", function(err) {
            if (err) {
                fs.unlink("/tmp/test.png");
                fs.rename(files.file.path, "/tmp/test.png");
            }
        });
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write("received image:<br/>");
        response.write("<img src='/show' />");
        response.end();
    });
}
于 2013-02-13T23:20:33.570 回答