2017-06-23 8 views
0

mkdirpthis answerを使用して、ディレクトリを作成してファイルを保存します。 platesの中にこれらのフォルダが作成され、存在する場合は再利用されます。ディレクトリでの不正な操作

const fs = require('fs') 
const mkdirp = require('mkdirp') 

// Decode image then save to local storage 
const decodeBase64Image = (string, plateNumber) => { 
    let regex = /^data:.+\/(.+);base64,(.*)$/ 
    let matches = string.match(regex) 
    let ext = matches[1] 
    let data = matches[2] 
    let buffer = new Buffer(data, 'base64') // I cant use Buffer.alloc() 

    let pathForImages = `plates/${plateNumber}` 

    saveImagesToPath(pathForImages, ext, buffer) 
} 


const saveImagesToPath = (pathForImages, ext, buffer) => { 
    mkdirp(pathForImages, function (err) { 

    fs.writeFileSync(pathForImages, 'data.' + ext, buffer) 

    }) 
} 

let string = "data:image/gif;base64,R0lGODlhPQBEAPeoAJosM//AwO/AwHVYZ/<SHORTEN>w==" 

// Performing it all 
decodeBase64Image(string, 'HGT5KU') 

エラーメッセージ:基本的に

fs.js:651 
    return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); 
       ^

Error: EISDIR: illegal operation on a directory, open 'plates/HGT5KU' 

、プレート番号の名前で「プレート」のサブフォルダを作成し、そのフォルダ内のデータを保存します。plates/HGT5KU/foo.pngその他:plates/GFTYU7/bar.jpg

答えて

3

fs.writeFileSyncには、ディレクトリ内のファイルではなく、ディレクトリに書き込むように指示しています。

mkdirp(pathForImages, function (err) { 
    fs.writeFileSync(pathForImages, 'data.' + ext, buffer) 
// ----------------^^^^^^^^^^^^ 
}) 

もちろん、それは失敗するでしょう。あなたは、パスにファイル名を追加する必要があります。

mkdirp(pathForImages, function (err) { 
    const filename = /*...create appropriate filename...*/; 
    fs.writeFileSync(pathForImages + "/" + filename, 'data.' + ext, buffer) 
}) 

サイドノート:

  1. それはエラーを無視することが一般的に良い習慣ではありません。 mkdirpが失敗する場合は、errをチェックする必要があります。

  2. mkdirpは非同期であるため、その中で同期呼び出しを使用することは意味がなく、不必要にJavaScriptスレッドを縛ります。ちょうどwriteFileを使用してください。一般的には、xyzSyncの機能を使用しないでください。は実際にはの理由があります。

  3. おそらくwriteFileSync/writeFileからエラーをテストすることをお勧めします。 :-)

+0

はい、私は 'err'を削除しますが、そこにあります。しかし、はい、私は今参照してください。ありがとう! – Sylar

+0

私はこうしました: "fs.writeFile(__ dirname +' /../${pathForImages+ '/ data。' + ext} '、buffer、function(err){})もう一度ありがとう – Sylar

+0

@Sylar:心配はいりません。あなたがコメント内のコードスパンにバッククイックを入れる必要がある場合は、スパンの周りの2つのバッククォートを使って、単に引用符で囲むことができます: '' fs.writeFile(__ dirname + '/../${pathForImages + '/data。 '+ ext} '、buffer、function(err){})' 'バックティックバックティックコードのバックティックバックティックです。 –

関連する問題