0

我尝试通过gridfs(没有临时文件)读出保存在mongodb中的图像,它应该直接发送到ajax,将其注入html

当我使用我的实际功能时,会形成一个大的位字符串并发送到客户端(保存在 ajax 响应变量中)

但是当它到达客户端时,这些位不再正确

所以我寻找一种在发送图片之前对图片进行编码的方法(进入base64)(或者还有其他方法吗?)

服务器端 - javascript、gridfs

exports.readFileFromDB = function(req, res, profile, filename, callback){
    console.log('Find data from Profile ' + JSON.stringify(profile));

    var GridReader = new GridStore(db, filename,"r");

    GridReader.open(function(err, gs) {

        var streamFile = gs.stream(true);

        streamFile.on("end", function(){

        });

        // Pipe out the data
        streamFile.pipe(res);
    GridReader.close(function(err, result) {

    });

客户端 - javascript ajax 调用:

function imgUpload(){

    var thumb = $("#previewPic");

    $('#uploadForm').ajaxSubmit({

        beforeSend:function(){
            //launchpreloader();
        },

        error: function(xhr) {
            //status('Error: ' + xhr.status);
        },

        success: function(response) {
            console.log(response);
            var imageData = $.base64Encode(response);
            console.log(imageData);
            thumb.attr("src","data:image/png;base64"+imageData);
            $("#spanFileName").html("File Uploaded")
        }
    });
}
4

1 回答 1

1

我正在为当前项目做类似的事情,但是上传完成后,我返回一个 JSON 对象,其中包含上传图像的 URL:

{ success : true, url : '/uploads/GRIDFSID/filename.ext' }

我在 Express 中有一个路由,它处理/uploads从 GridFS 检索文件并将其流式传输回客户端的路由,因此我可以在 IMG SRC 中使用上述 URL。这实际上是 DOM 中出现的内容:

<img src="/uploads/GRIDFSID/filename.ext">

路由处理程序看起来像这样(它使用node-mimeand gridfs-stream):

app.get(/^\/uploads\/([a-f0-9]+)\/(.*)$/, function(req, res) {
  var id        = req.params[0];
  var filename  = req.params[1];

  // Set correct content type.
  res.set('Content-type', mime.lookup(filename));

  // Find GridFS file by id and pipe it to the response stream.
  gridfs
    .createReadStream({ _id : id })
    .on('error', function(err) {
      res.send(404); // or 500
    })
    .pipe(res);
});

如果我的解决方案适合您,这显然取决于您的确切设置。

于 2013-07-17T20:45:24.960 回答