UPDATE
J'ai trouvé ceci lien intéressant comment résoudre votre problème en PHP . Je pense que vous avez oublié de remplacer space
par +
comme indiqué dans le lien.
J'ai pris ce cercle dans http://images-mediawiki-sites.thefullwiki.org/04/1/7/5/6204600836255205.png comme échantillon qui ressemble à :
![http://images-mediawiki-sites.thefullwiki.org/04/1/7/5/6204600836255205.png]()
Ensuite, je l'ai mis dans http://www.greywyvern.com/code/php/binary2base64 qui m'a renvoyé :
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAAAAACPAi4CAAAAB3RJTUUH1QEHDxEhOnxCRgAAAAlwSFlzAAAK8AAACvABQqw0mAAAAXBJREFUeNrtV0FywzAIxJ3+K/pZyctKXqamji0htEik9qEHc3JkWC2LRPCS6Zh9HIy/AP4FwKf75iHEr6eU6Mt1WzIOFjFL7IFkYBx3zWBVkkeXAUCXwl1tvz2qdBLfJrzK7ixNUmVdTIAB8PMtxHgAsFNNkoExRKA+HocriOQAiC+1kShhACwSRGAEwPP96zYIoE8Pmph9qEWWKcCWRAfA/mkfJ0F6dSoA8KW3CRhn3ZHcW2is9VOsAgoqHblncAsyaCgcbqpUZQnWoGTcp/AnuwCoOUjhIvCvN59UBeoPZ/AYyLm3cWVAjxhpqREVaP0974iVwH51d4AVNaSC8TRNNYDQEFdlzDW9ob10YlvGQm0mQ+elSpcCCBtDgQD7cDFojdx7NIeHJkqi96cOGNkfZOroZsHtlPYoR7TOp3Vmfa5+49uoSSRyjfvc0A1kLx4KC6sNSeDieD1AWhrJLe0y+uy7b9GjP83l+m68AJ72AwSRPN5g7uwUAAAAAElFTkSuQmCC
a enregistré cette chaîne dans base64
que je lis dans mon code.
var fs = require('fs'),
data = fs.readFileSync('base64', 'utf8'),
base64Data,
binaryData;
base64Data = data.replace(/^data:image\/png;base64,/, "");
base64Data += base64Data.replace('+', ' ');
binaryData = new Buffer(base64Data, 'base64').toString('binary');
fs.writeFile("out.png", binaryData, "binary", function (err) {
console.log(err); // writes out file without error, but it's not a valid image
});
Je reçois un cercle de retour, mais le plus drôle est que la taille des fichiers a changé :)...
FIN
Quand vous relisez l'image, je pense que vous devez configurer les en-têtes.
Prenez par exemple imagepng de la page PHP :
<?php
$im = imagecreatefrompng("test.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
Je pense que la deuxième ligne header('Content-Type: image/png');
est important, sinon votre image ne sera pas affichée dans le navigateur, mais juste un tas de données binaires est montré au navigateur.
Sur Express vous devez simplement utiliser quelque chose comme ci-dessous. Je vais afficher votre gravatar qui se trouve à l'adresse suivante http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG et est un fichier jpeg lorsque vous curl --head http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG
. Je ne demande que les en-têtes parce que sinon curl va afficher un tas de trucs binaires (Google Chrome va immédiatement télécharger) à la console :
curl --head "http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 03 Aug 2011 12:11:25 GMT
Content-Type: image/jpeg
Connection: keep-alive
Last-Modified: Mon, 04 Oct 2010 11:54:22 GMT
Content-Disposition: inline; filename="cabf735ce7b8b4471ef46ea54f71832d.jpeg"
Access-Control-Allow-Origin: *
Content-Length: 1258
X-Varnish: 2356636561 2352219240
Via: 1.1 varnish
Expires: Wed, 03 Aug 2011 12:16:25 GMT
Cache-Control: max-age=300
Source-Age: 1482
$ mkdir -p ~/tmp/6922728
$ cd ~/tmp/6922728/
$ touch app.js
app.js
var app = require('express').createServer();
app.get('/', function (req, res) {
res.contentType('image/jpeg');
res.sendfile('cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG');
});
app.get('/binary', function (req, res) {
res.sendfile('cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG');
});
app.listen(3000);
$ wget "http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG"
$ node app.js
1 votes
J'ai mis à jour la réponse, ce qui, je pense, est ce dont vous aviez besoin en premier lieu ;)
0 votes
Évidemment, ce n'est pas ce que vous avez demandé, mais (dans mon cas) j'ai réalisé que la meilleure approche était simplement de stocker la chaîne encodée entière dans ma base de données (vous pouvez toujours la charger en utilisant la commande
<img src="data:image/png;base64,..." />
). C'est juste une option à prendre en compte pour les autres personnes qui utilisent ce fil de discussion comme référence.