【发布时间】:2019-01-22 07:52:19
【问题描述】:
注意:这不是生产应用程序。这是我正在制作的一个小应用程序,用于探索从数据库中选择、打开、保存和读取图像的功能。
我不知道应该调用什么方法来获取正确的缓冲区数据以将图像存储在 mongodb 中。 (我知道 mongoDB 对文档有 16mb 的限制)
在我的应用程序中,我希望用户能够从他们电脑上的文件中选择图像,为用户提供图像预览,然后当用户点击提交时(此处未显示)将图像保存到 mongodb
我知道当用户点击“选择文件”按钮时,我可以得到这样的文件:
const file = event.target.files[0]
if (!file) {
// user has hit the cancel button
return;
}
//console.log(file);
我可以获得有关文件的信息:
console.log(file.type);
console.log(file.size);
这是读取图像的方式:
let fr = new FileReader();
fr.readAsDataURL(file);
fr.onload = (e) =>{
this.productImageAdd(e.target.result);
}
这就是图像在(反应)组件状态下的存储方式
productImageAdd = (file) => {
let temp = this.state["filesArray"] || [];
temp.push(file);
this.setState({"filesArray": temp});
}
这是我的组件的状态
this.state = {
filesArray: [],
};
在另一个组件中,我获取所有图像的列表,然后将它们映射到一个项目以进行显示:
return filesArray.map((file, index) => (
<FileDropZoneItem key={index} id={index} file={file} />
));
在 FileDropZoneItem 中,这是“预览”图像的方式:
return (
<li className="flex-item ">
<img src={file} width="200" height="200"/>
</li>
);
我看到了这个 stackoverflow 问题,我正朝着将图像存储在 MongoDB 中的方向前进:
Store an image in MongoDB using Node.js/Express and Mongoose
在那篇文章中,他们的架构是这样的:
var schema = new Schema({
img: { data: Buffer, contentType: String }
});
他们像这样存储图像:
var A = mongoose.model('A', schema);
var a = new A;
a.img.data = fs.readFileSync(imgPath);
a.img.contentType = 'image/png';
但我真的不知道 fs.readFileSync 和 fr.readAsDataURL 之间的区别。
将使用 fr.readAsDataURL 存储到 mongodb 还是我需要 fs.readFileSync ?
我也看到了:Difference between readAsBinaryString() and readAsDataURL() in HTML5 FileReader API
【问题讨论】:
-
but I don't really know the difference between fs.readFileSync and fr.readAsDataURL.一个是nodejs代码一个是浏览器代码 -
@tkausl 他们返回相同的东西吗?
-
@MLissCetrus No.
fr.readAsDataURL不返回任何内容,而fs.readFileSync返回给定路径的文件内容。 -
@Itai Steinherz ...从字面上看,我同意你的看法,但是,在我提供的代码中,它最终返回一个值“e.target.result” - 这是主题这篇文章以及我有兴趣了解的内容
-
@MLissCetrus 见the File API docs。