对目录进行非法操作,打开

时间:2017-06-23 11:01:10

标签: javascript node.js

使用this answermkdirp,我想创建一个目录并在其中保存文件。在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'

基本上,为&#34; plate&#34;创建一个子文件夹。使用铭牌编号的名称并在该文件夹中保存数据:plates/HGT5KU/foo.png其他人:plates/GFTYU7/bar.jpg

2 个答案:

答案 0 :(得分:9)

您告诉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的错误。 : - )

答案 1 :(得分:0)

请在路径中使用文件名以及文件数据。

例如:

const fullPath = path.join('c/d', 'somefilename');
fs.writeFile(fullPath, file.data);