2016-08-24 10 views
0

クライアントからアップロードされた画像を保存しようとしましたが、私のコードはpngやjpgでうまく動作しますが、svgではうまく動作しません。最善の方法は何ですか?Node save filereader base64 svgアップロードwith fs

クライアント側:<input type="file> =>fileReader.readAsDataURL =>fileReader.result =>xhr

サーバー側:

saveUserImage(userid, file, base64, callback) { 
    if(file.type.indexOf('image') != 0) 
    return callback(false); 

    var fs = require("fs"); 

    var regEx = new RegExp('^data:' + file.type + ';base64,'); 
    base64 = base64.replace(regEx, ""); 

    fs.mkdir('imgs', function() { 
    fs.writeFile('imgs/' + userid + "_" + file.name, base64, 'base64', function(err) { 
     if(err) return callback(false); 
     return callback('imgs/' + userid + "_" + encodeURIComponent(file.name)); 
    }); 
    }); 
} 

保存されたSVGの私は思う間違って符号化されています:SVGサポート

u«ZŠf {û/ƒìf•¶¬{®Þ[™\œÚ[ÛHŒKŒˆ[˜ÛÙ[™ÏHš\ÛËN 
NKLHÏ‚KKHÙ[™\˜]ÜŽˆYØ™H[\ݘ]܈NKŒŒÕ‘È^ÜYËR[ˆˆÕ‘È™\œÚ[ÛŽˆ 
‹ŒZ[ 
HKO‚ݙș\œÚ[ÛHŒKŒHˆYH“^Y\—ÌHˆ[œÏHš‹ËÝÝÝËÌ˛ܙËÌŒÜݙȈ[œÎž[šÏHš‹ËÝÝÝËÌ˛ܙËÌNNNKÞ[šÈˆHŒˆOHŒ‚‚HšY]ЛÞHŒLËLŒHLËLŒHˆÝ[OH™[˜X›KX˜XÚÙÜ›Ý[™›™]ÈLËLŒHLËLŒNȈ[œÜXÙOHœ™\Ù\™H‚Ï‚‚OÏ‚‚BOÏ‚‚BBOÏ‚‚BBBOÏ‚‚BBBBO]Ý[OH™š[ˆÍȈH“LLLËŽLË‹Ž˜Í‹ŒÌLKÌ‹ 
ËŒÍKŒM‹‹ŒÍÎÌ΂BBBBBXËMKŒMKLŒN 
LMKMËMKŽMLËL‹ŒÎ 
‹MKŽÌ˜ËM‹ŒÌLËNÍMËŒÍKLŒML‹ŒÍÍËLÌ΂BBBBBPÎL‹ÎNÌ‹ 
ÍLËŒNN‹Ì 
KLLËŽLË‹Žžˆ‹Ï‚‚BBBOÙÏ‚‚BBBOÏ‚‚BBBBO]Ý[OH™š[ˆÌÌÌÍŒÐNȈH“NKŽLNK 
ÌËŒÌ͘ËM‹ŒÌLËNÍMËŒÍKLŒML‹ŒÍÍËLÌ΂BBBBBXÍKŒM‹LLŒN 
MKM‹LMKŽMLË‹ŒÎ 
KLMKŽÌˆ‹Ï‚‚BBBOÙÏ‚‚BBBOÏ‚‚BBBBO]Ý[OH™š[ˆÌÌÌÍŒÐNȈH“NLŒŒK 
ÍŽÍØËLŒL‹LŒŒÎLŒKLŒÍNLŒ˜ËL 
ÍLŒ 
‹LŽLMËLŒŒÍLKŒNM‹LŒM‚BBBBBXËM‹ŽLKNKLËMËŽ 
KLŒKŽ 
LKL‹MËLÌ‹ŒXÍKŒÌLËLLŒŽL‹MKÍÎKLM‹ 
‹ËŒÍÍ‹LM‹ 
˜ÌŒL‹ŒŒÎŒKŒÍNŒ‚‚BBBBBXÌ 
͌ 
‹ŽLMËŒŒÍKŒNM‹ŒMØÍ‹ŽLKKLË 
ËŽ 
‹ŒKŽ 
LK‹NÌ‹ŒPÌLL‹ŒÌË 
Ž 
LKŽ 

だろういいです、どんなアイデアですか?

答えて

0

問題は、svgのMIMEタイプがimage/svg+xmlであることです。プラスはエスケープされず、正規表現は一致しません。私は脱出する簡単な関数を使用して、今それはあなたにもjs-base64-fileモジュールを試してみてください

function escapeRegExp(str) { 
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
} 
0

PERFEKT動作します。生のsvgをディスクに保存してから変換してください。

github repo

const Base64File=require('js-base64-file'); 
const image=new Base64File; 

const file='test.svg'; 

//path should alwas end in a/
const path=`${__dirname}/`; 

//this will load and convert if needed 
const data=image.loadSync(path,file); 
console.log('you could send this image via ws or http to the browser now : \n',data); 

image.save(data,path,`copy-b64-${file}`); 

あなたはtest.jsファイルに非同期の例を見ることができます。

関連する問題