栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用NodeJS将文件上传到Amazon S3

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用NodeJS将文件上传到Amazon S3

因此,看来这里有些问题。根据您的帖子,您似乎正在尝试使用

connect-multiparty
中间件支持文件上传。该中间件所做的是获取上载的文件,将其写入本地文件系统,然后设置
req.files
为上载的文件。

您的路由配置看起来不错,问题似乎出在您的

items.upload()
功能上。特别是这部分:

var params = {  Key: file.name,  Body: file};

正如我在答案开头提到的那样,

connect-multiparty
将文件写入本地文件系统,因此您需要打开文件并读取它,然后将其上传,然后在本地文件系统上将其删除。

也就是说,您可以将方法更新为以下内容:

var fs = require('fs');exports.upload = function (req, res) {    var file = req.files.file;    fs.readFile(file.path, function (err, data) {        if (err) throw err; // Something went wrong!        var s3bucket = new AWS.S3({params: {Bucket: 'mybucketname'}});        s3bucket.createBucket(function () { var params = {     Key: file.originalFilename, //file.name doesn't exist as a property     Body: data }; s3bucket.upload(params, function (err, data) {     // Whether there is an error or not, delete the temp file     fs.unlink(file.path, function (err) {         if (err) {  console.error(err);         }         console.log('Temp File Delete');     });     console.log("PRINT FILE:", file);     if (err) {         console.log('ERROR MSG: ', err);         res.status(500).send(err);     } else {         console.log('Successfully uploaded data');         res.status(200).end();     } });        });    });};

这是从本地文件系统读取上载的文件,然后将其上载到S3,然后删除临时文件并发送响应。

这种方法存在一些问题。首先,它效率不高,对于大型文件,您将在写入之前加载整个文件。其次,此过程不支持大文件的分段上传(我认为在进行分段上传之前,截止值为5
Mb)。

相反,我建议您使用的是我一直在研究的模块S3FS,它提供了与Node.JS中本机FS相似的接口,但抽象了一些细节,例如分段上传和S3
api (以及添加一些其他功能,例如递归方法)。

如果要拉入S3FS库,则代码将如下所示:

var fs = require('fs'),    S3FS = require('s3fs'),    s3fsImpl = new S3FS('mybucketname', {        accessKeyId: XXXXXXXXXXX,        secretAccessKey: XXXXXXXXXXXXXXXXX    });// Create our bucket if it doesn't exists3fsImpl.create();exports.upload = function (req, res) {    var file = req.files.file;    var stream = fs.createReadStream(file.path);    return s3fsImpl.writeFile(file.originalFilename, stream).then(function () {        fs.unlink(file.path, function (err) { if (err) {     console.error(err); }        });        res.status(200).end();    });};

要做的是实例化提供的存储桶和AWS凭证的模块,然后创建存储桶(如果不存在)。然后,当请求上传文件时,我们将打开一个流到该文件的流,并使用该流将文件写入S3到指定路径。这将在后台处理多部分上传文件(如果需要),并且具有通过流完成操作的好处,因此您无需等待读取整个文件即可开始上传文件。

如果愿意,可以将代码更改为Promises的回调。或将pipe()方法与事件侦听器一起使用来确定结束/错误。

如果您正在寻找其他方法,请查看s3fs的文档,如果您正在寻找其他方法或遇到问题,请随时提出问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号