Node.js通过REST API发送图像

我努力寻找材料

我有一个使用mongoDB编写的用node.js编写的API。

我希望用户能够上传图片(个人资料图片),并保存在服务器上(在mongoDB)。

有几个问题,我见过build议使用GridFS,这是最好的解决scheme吗?

我如何发送这些文件? 我见过res.sendFile,但这又是最好的解决scheme吗?

如果有人有任何材料,他们可以链接我,我会感激

谢谢

使用文件系统

一般来说,在任何数据库中,图像位置都stringforms 存储在数据中,该string告诉应用程序图像在文件系统上的存储位置。

除非数据库需要作为一个单元可移植,否则将数据库内的图像作为二进制对象存储通常会给数据库增加不必要的大小和复杂性。
– Michael Stearne

在MongoDB中,使用GridFS存储大于16 MB的文件。 – Mongo文档

因此,除非您的映像超过16 MB,否则应该将文件存储在CDN (最好)或服务器自己的文件系统上,并将其URL保存到数据库上的用户文档中。


本地文件系统的实现

此方法使用Busboyparsing照片上传。

在相关的html文件中:

<input type="file" title="Choose a file to upload" accept="image/*" autofocus="1"> 

在服务器文件中,您的照片上传path的处理程序function(您将需要填写适用于您的variables并需要必要的模块):

 function photoUploadHandlerFunction (req, res) { var busboy = new Busboy({ headers: req.headers }) busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { const saveToDir = path.join(__dirname, uploadsPath, user.id) const saveToFile = path.join(saveToDir, filename) const pathToFile = path.join(uploadsPath, user.id, filename) const writeStream = fs.createWriteStream(saveToFile) createDirIfNotExist(saveToDir) .then(pipeUploadToDisk(file, writeStream)) .then(findUserAndUpdateProfilePic(user, pathToFile)) .catch((err) => { res.writeHead(500) res.end(`Server broke its promise ${err}`) }) }) busboy.on('finish', function () { res.writeHead(200, { 'Connection': 'close' }) res.end("That's all folks!") }) return req.pipe(busboy) } 

如果promise函数createDirIfNotExistpipeUploadToDisk看起来像这样:

 function createDirIfNotExist (directory, callback) { return new Promise(function (resolve, reject) { fs.stat(directory, function (err, stats) { // Check if error defined and the error code is "not exists" if (err) { if (err.code === 'ENOENT') { fs.mkdir(directory, (err) => { if (err) reject(err) resolve('made folder') }) } else { // just in case there was a different error: reject(err) } } else { resolve('folder already existed') } }) }) } function pipeUploadToDisk (file, writeStream) { return new Promise((resolve, reject) => { const fileWriteStream = file.pipe(writeStream) fileWriteStream.on('finish', function () { resolve('file written to file system') }) fileWriteStream.on('error', function () { reject('write to file system failed') }) }) } 

要回答你的问题'如何发送这些文件?',我需要知道在哪里(MongoDB,对客户端…)。 如果你的意思是给客户端,你可以在保存它们的地方提供静态文件夹。

如果你仍然想学习实施GridFs tutorialspoint有一个很好的教程


更多的材料

  • 处理表单上传的好教程
  • 教程使用节点强大的模块

您将无法直接获取服务器上的文件对象。 要获取服务器上的文件对象,请使用connect-multiparty中间件。 这将允许您访问服务器上的文件。

 var multipart = require('connect-multiparty'); var multipartmiddleware = multipart(); var mv = require('mv'); var path = require('path'); app.post("/URL",multipartmiddleware,function(req,res){ var uploadedImage = req.files.file; for (var i = 0; i < uploadedImage.length; i++) { var tempPath = uploadedImage[i].path; var targetPath = path.join(__dirname ,"../../../img/Ads/" + i + uploadedImage[i].name); mv(tempPath, targetPath, function (err) { if (err) { throw err; } }); } }) 

如果您使用的是mongoose odm,则可以使用mongoose-crate模块并将文件发送到任何存储位置。

而且,对于像AWS S3或Azure blob存储这样的共享对象存储来说,这是一个很好的例子。 如果您正在使用像AWS这样的分布式安装程序,通常不希望将照片存储在本地服务器上。

将URL或密钥名称存储在指向S3对象的数据库中。 这也很容易与CloudFront CDN集成。

如前所述。 MultiPart用于实际上传。

Interesting Posts