2013-09-25 128 views
9

Tôi đã tìm thấy các bài đăng gần với những gì tôi đang tìm kiếm, nhưng tôi đã không thể triển khai thành công những gì tôi muốn. Đây là dòng chảy chung:Chuyển đổi hình ảnh Base64 thành nhị phân thô với Node.js

  1. Gửi ảnh với phần còn lại của dữ liệu địa điểm, như dữ liệu base64
  2. Strip tiền tố dữ liệu nếu nó tồn tại, vì vậy tôi chỉ có dữ liệu hình ảnh base64

var base64data = venue.image.replace(/^data:image\/png;base64,|^data:image\/jpeg;base64,|^data:image\/jpg;base64,|^data:image\/bmp;base64,/, ''); 

  1. Lưu trữ dữ liệu Base64 trong GridFS qua MongoDB (Tôi đang sử dụng gridfstore)
  2. Sau đó, tôi muốn truy xuất hình ảnh theo yêu cầu dưới dạng tệp hình ảnh thô qua URL.

// generic images route 
server.get(version+'/images/:id', function(req, res) { 
    gridfstore.read(req.params.id, function(error,data) { 
    res.writeHead(200, { 
     'Content-Type': 'image/jpeg', 
     'Content-Length': data.buffer.length 
    }); 

    res.end(data.buffer); 
    }); 
}); 

Về cơ bản, phương pháp này sẽ trả về Base64 byte lưu trữ trong GridFS. Tôi đã thử các phương pháp khác nhưng chúng không trả về hình ảnh thô.

Tôi muốn kéo lên hình ảnh sử dụng URL như thế này:

http://[localhost]/1/images/11dbcef0-257b-11e3-97d7-cbbea10abbcb 

Đây là một ảnh chụp màn hình của các dấu vết trình duyệt: browser trace

Trả lời

15

Bạn có thể lấy chuỗi từ MongoDB, tạo ra một Ví dụ bộ đệm mới và chỉ định mã hóa khi làm như vậy. Bộ đệm kết quả sẽ có dữ liệu nhị phân.

var b64str = /* whatever you fetched from the database */; 
var buf = new Buffer(b64str, 'base64'); 

Vì vậy, trong thực hiện của bạn:

server.get(version+'/images/:id', function(req, res) { 
    gridfstore.read(req.params.id, function(err, data) { 
    var img = new Buffer(data.buffer, 'base64'); 

    res.writeHead(200, { 
     'Content-Type': 'image/jpeg', 
     'Content-Length': img.length 
    }); 
    res.end(img); 

    }); 
}); 
+0

cảm ơn @hexacyanide, tôi đã thử những gì bạn đề xuất nhưng nó sẽ trở lại như một hình ảnh không hợp lệ. Bộ đệm được phân bổ chính xác và độ dài chính xác nhưng hình ảnh không hiển thị, vì vậy tôi sẽ đào sâu hơn một chút và xem liệu tôi có thể cung cấp thêm thông tin hay không. Khi tôi lấy dữ liệu Base64 URI, và hiển thị nó trong trang HTML với nó hoạt động, vì vậy ít nhất tôi biết Base64 là hợp lệ. – remotevision

+0

Vì vậy, bạn đang cố gắng làm gì? Bạn đang cố gắng chỉ hiển thị hình ảnh trên một trang? – hexacyanide

+0

Tôi đang cố gắng trả lại hình ảnh, giống như bạn sẽ gọi http: // [somehost] /someimage.jpg. Tôi đã đính kèm một ảnh chụp màn hình nếu nó giúp gì cả. Với mã bạn đề xuất, trình duyệt chỉ cần đồng hồ. Ngoài ra, tôi đang sử dụng Restify trên máy chủ nhưng từ những gì tôi đã đọc, nó hỗ trợ Node.js ServerResponse. http://mcavage.me/node-restify/#Content-Negotiation – remotevision

0

Hãy chắc chắn rằng chuỗi của bạn là đúng. Điều này làm việc cho tôi ..

var buf = new Buffer(b64stringhere, 'base64'); 
var express = require('express'), app = express(); 
app.get('/img', function(r, s){ 
    s.end(buf); 
}) 
app.listen(80); 
+0

yup làm việc cho tôi –