繁体   English   中英

在目录上非法操作,打开

[英]illegal operation on a directory, open

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

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

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

例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM