如何在NodeJS中创建一个带路径的文件对象?

时间:2017-04-05 12:29:29

标签: javascript node.js file

我想知道是否可以使用现有文件的路径在NodeJS中创建文件对象(名称,大小,数据......)?我知道在客户端这是可能的,但我没有看到NodeJS。

换句话说,我想在NodeJS中使用相同的功能:

function srcToFile(src, fileName, mimeType){
    return (fetch(src)
        .then(function(res){return res.arrayBuffer();})
        .then(function(buf){return new File([buf], fileName, {type:mimeType});})
    );
}

srcToFile('/images/logo.png', 'logo.png', 'image/png')
.then(function(file){
    console.log(file);
});

输出就像:

File {name: "logo.png", lastModified: 1491465000541, lastModifiedDate: Thu Apr 06 2017 09:50:00 GMT+0200 (Paris, Madrid (heure d’été)), webkitRelativePath: "", size: 49029, type:"image/png"…}

3 个答案:

答案 0 :(得分:2)

对于那些正在寻找解决此问题的方法的人,我创建了一个 npm 包,以便更轻松地使用 Node 的文件系统检索文件并将它们转换为 JS File 对象:

https://www.npmjs.com/package/get-file-object-from-local-path

这解决了 Node 的 fs 文件系统(浏览器无权访问)和浏览器的 File 对象类型之间缺乏互操作性,Node 无法创建。

需要 3 个步骤:

  1. 获取Node实例中的文件数据,并从中构造一个LocalFileData对象
  2. 将创建的LocalFileData对象发送给客户端
  3. 在浏览器中将 LocalFileData 对象转换为 File 对象。
// Within node.js
const fileData = new LocalFileData('path/to/file.txt')

// Within browser code
const file = constructFileFromLocalFileData(fileData)

答案 1 :(得分:0)

所以,我搜索文件系统和其他可能性,什么也没有。 我决定使用JSON创建自己的File对象。

  var imagePath = path.join('/images/logo.png', 'logo.png');

  if (fs.statSync(imagePath)) {
     var bitmap = fs.readFileSync(imagePath);
     var bufferImage = new Buffer(bitmap);

     Magic = mmm.Magic;
     var magic = new Magic(mmm.MAGIC_MIME_TYPE);
     magic.detectFile(imagePath, function(err, result) {
          if (err) throw err;
          datas = [{"buffer": bufferImage, "mimetype": result, "originalname": path.basename(imagePath)}];
          var JsonDatas= JSON.parse(JSON.stringify(datas));
          log.notice(JsonDatas);
     });
 }

输出:

{ 
  buffer:
  { 
    type: 'Buffer',
    data:
    [ 
      255,
      216,
      255
      ... 24908 more items,
      [length]: 25008 
    ] 
  },
  mimetype: 'image/png',
  originalname: 'logo.png' 
}

我认为可能不是更好的解决方案,但它给了我想要的东西。如果您有更好的解决方案,欢迎您。

答案 2 :(得分:-2)

您可以在fs(FileSystem对象)下使用arrayBuffer(这就是我做的可下载的pdf)或createReadStream / createWriteStream