使用this answer和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'
基本上,为&#34; plate&#34;创建一个子文件夹。使用铭牌编号的名称并在该文件夹中保存数据:plates/HGT5KU/foo.png
其他人:plates/GFTYU7/bar.jpg
答案 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)
})
附注:
忽略错误通常不是好习惯。 mkdirp
可能会失败,您需要检查err
。
由于mkdirp
是异步的,因此在其中使用同步调用是没有意义的,并且不必要地占用JavaScript线程。只需使用writeFile
即可。一般情况下,如果没有确实使用它们,请避免使用xyzSync
函数。
也可以最好地测试来自writeFileSync
/ writeFile
的错误。 : - )
答案 1 :(得分:0)
请在路径中使用文件名以及文件数据。
例如:
const fullPath = path.join('c/d', 'somefilename');
fs.writeFile(fullPath, file.data);