1

我在 Cordova-2.2.0 上构建了这个 Android 应用程序,我在服务器端使用节点。有一部分需要将图像从相机或文件发送到服务器。图片已成功上传到服务器,但保存时似乎已损坏。如果我在记事本上打开图像,文件上有这个“额外的标题”。除此之外,所有文件都是一样的。这是我在客户端上的代码:

function getPhoto() {

        navigator.camera.getPicture(uploadPhoto,
                                    function(message) { alert('No image selected');},
                                    { quality: 50, 
                                    destinationType: navigator.camera.DestinationType.FILE_URI,
                                    sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY }
                                    );

    }

function uploadPhoto(imageURI) {
        var largeImage = document.getElementById('Image');
        largeImage.style.display = 'block';
        largeImage.src = imageURI;
        var options = new FileUploadOptions();
        options.fileKey="file";
        options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
        options.mimeType="image/jpg";

        options.chunkedMode = false;

        var ft = new FileTransfer();
        ft.upload(imageURI, "http://10.8.13.92:8082", win, fail, options);
    }

这是服务器上的代码:

http.createServer(function (req,res){
var fs = require('fs');
var imagen = fs.createWriteStream("imagen.jpg",{'flags':'a'});

req.addListener('response',function(response){

})
});

req.addListener('data',function(chunk){
    imagen.write(chunk,encoding='binary');
});

req.on('end',function(){
    imagen.end();

    console.log('File written');
});

}).listen(8082);

我知道问题出在服务器上,但我找不到任何与此不同的东西来编写 .jpg 文件。

4

1 回答 1

0

从文档:

FileTransfer 对象提供了一种使用 HTTP 多部分 POST 请求将文件上传到远程服务器的方法。

您正在尝试将所有请求数据写入图像文件,但请求数据不仅仅是二进制图像数据。它包含 HTTP 多部分格式的文件,需要在写入文件之前进行解析。

最简单的方法 - 使用connect和 bodyParser 中间件。

示例应用程序:

var http = require('http');
var connect = require('connect');

var app = connect();
var server = http.createServer(app);
app.use(connect.bodyParser());
app.use(function(req, res) {
    console.log(req.files); // Here is object with uploaded files
});

server.listen(8082);

您可以在对象中找到上传文件的路径req.files并将其移动到所需的目的地。

于 2013-01-22T00:33:18.903 回答