将缓冲区转换为文件 [FileCollection:meteor/ostrio:files]

Convert buffer to file [FileCollection:meteor/ostrio:files]

当我从输入中获取图像时 我必须将它转换为缓冲区才能对图像进行一些操作,因此我有一个缓冲区而不是文件。 我在流星中使用 FileCollection 将图像存储在 mongo 集合

uploadIt(e) {
  e.preventDefault();
  var reader = new FileReader();
  var buffer;
  var file = e.currentTarget.files[0];
  if (e.currentTarget.files && e.currentTarget.files[0]) {
    reader.onload = function(e){
      buffer = new Uint8Array(reader.result);
      // some operations over the buffer
  };
  reader.readAsArrayBuffer(file);
  if (file) {
    let uploadInstance = CourseFilesCollection.insert({
      file: buffer,
      ..
      ..
    })
  }
}

但是当我插入它时出现这个错误

message: "[FilesCollection] [insert] Have you forget to pass a File itself?

代码最初是

 if (file) {
    let uploadInstance = CourseFilesCollection.insert({
      file: file,
      ..
      ..
    })
  }

但由于我必须对图像执行操作,所以我需要以某种方式将缓冲区转换为文件 任何想法如何解决这个问题?

简答

使用 file constructor 将位转换回文件容器:

file: new File([buffer], file.name, file)

您也可以尝试使用 blob 以及更广泛的浏览器支持...但是如果您想使用最新的技术,那么:

async uploadIt (evt) {
    evt.preventDefault()
    const file = evt.currentTarget.files[0]
    if (!file) return
    const buffer = new Uint8Array(await file.arrayBuffer())
    // some operations over the buffer

    const uploadInstance = CourseFilesCollection.insert({
        file: new File([buffer], file.name, file)
    })
}