2013-09-25 20 views
9

Znalazłem posty bliskie tego, czego szukam, ale nie udało mi się z powodzeniem wdrożyć tego, co chcę. Oto ogólny przepływ:Konwertuj obraz Base64 na surowy plik binarny za pomocą Node.js

  1. Prześlij zdjęcie z resztą dane miejsce, jako dane base64
  2. Strip dane prefiksu, jeśli istnieje, więc mam tylko dane obrazu base64

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

  1. przechowywania danych Base64 w GridFS poprzez MongoDB (używam gridfstore)
  2. Następnie chciałbym pobrać obraz na żądanie jako nieprzetworzony plik obrazu za pośrednictwem adresu 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); 
    }); 
}); 

W zasadzie, metoda ta zwraca base64 bajtów przechowywane w GridFS. Próbowałem innych metod, ale nie zwracają surowego obrazu.

chciałbym podciągnąć obraz, używając URL tak:

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

Oto zrzut ekranu śladu przeglądarki: browser trace

Odpowiedz

15

Można wziąć ciąg z MongoDB, stworzyć nowa instancja bufora i w razie potrzeby określ kodowanie. Wynikowy bufor będzie w danych binarnych.

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

Więc w swojej realizacji:

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

dzięki @hexacyanide, próbowałem tego, co sugerowałeś, ale wraca jako nieprawidłowy obraz. Bufor jest dokładnie przydzielony, a długość jest dokładna, ale obraz po prostu się nie wyświetla, więc zrobię trochę więcej kopania i zobaczę, czy mogę podać dodatkowe informacje. Kiedy biorę identyfikator URI danych Base64 i wyświetlam go na stronie HTML z to działa, więc przynajmniej wiem, że Base64 jest ważny. – remotevision

+0

Więc co próbujesz zrobić? Czy próbujesz wyświetlić obraz na stronie? – hexacyanide

+0

Próbuję po prostu zwrócić obraz, tak jak byś nazwał http: // [somehost] /someimage.jpg. Załączam zrzut ekranu, jeśli w ogóle to pomaga. Za pomocą kodu, który zasugerowałeś, przeglądarka po prostu się zegarem. Korzystam również z funkcji Restify na serwerze, ale z tego, co przeczytałem, obsługuje on Node.js ServerResponse. http://mcavage.me/node-restify/#Content-Negotiation – remotevision

0

Upewnij się, że łańcuch jest prawidłowe. To zadziałało dla mnie ..

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

tak działa dla mnie –