[英]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)
})
旁注:
忽略错误通常不是一个好习惯。 mkdirp
可能失败,您需要检查err
。
由于mkdirp
是异步的,因此在其中使用同步调用是没有意义的,并且不必要地占用了JavaScript线程。 只需使用writeFile
。 在一般情况下,避免xyzSync
功能没有很好的理由来使用它们。
也可能最好测试一下writeFileSync
/ writeFile
错误。 :-)
请在路径中使用文件名以及文件数据。
例如:
const fullPath = path.join('c/d', 'somefilename');
fs.writeFile(fullPath, file.data);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.