javascript - 直接从服务器将 csv 文件上传到 aws s3 存储桶
问题描述
大家周末快乐,
我正在从事一项从 API 获取数据然后将它们存储到 csv 文件中然后从那里直接上传到 AWS S3 存储桶的任务。我已经尝试了几种方法,但我目前被困在最后一点。任何帮助将不胜感激
我下面的代码将演示大多数问题以及到目前为止我一直在尝试的内容。
- 首先,我将从 API 获取数据
async systems() {
const endpoint = sampleEndPoints.SYSTEMS
return this.aggregateEndpoint(endpoint)
}
- 其次,我将获取取回的数据并将它们作为缓冲区放入 csv 文件中。(因为我必须
fs.createReadStream
稍后将它们存储起来)
// generate JSON to Buffer
async generateCsvToBuffer(json){
const {aws} = this.config
var ws = xlsx.utils.json_to_sheet(json)
var wb = xlsx.utils.book_new();
await xlsx.utils.book_append_sheet(wb, ws, 'Systems')
const csvParsed = xlsx.write(wb, { type: 'buffer'})
return csvParsed;
}
- 第三,我从中得到了
buffer data
它csvParsed
,以便将upload
它用于亚马逊 AWS S3。问题就在这里,Body: fileStream.path
应该显示文件的内容,但不幸的是,它像这样从fs.createReadStream
'{"type":"Buffer","data":[80,75,3,4,10,0,0,0,0,0,249,117,199,78,214,146,124
async uploadSample(file){
const {aws} = this.config
AWS.config.update({
secretAccessKey: aws.secretAccessKey,
accessKeyId: aws.accessKeyId,
region: 'us-east-2'
})
const bufferObject = new Buffer.from(JSON.stringify(file))
/*** WE NEED THE FILE SYSTEM IN ORDER TO STORE */
const fileStream = fs.createReadStream(bufferObject)
const uploadParams = {Bucket: aws.bucket, Key: aws.key, Body: fileStream.path}
const s3 = new AWS.S3()
await s3.upload(uploadParams,null,function(error, file){
if(error){
console.log(error)
} else {
console.log('Successfully uploaded')
}
})
}
- 我所有的功能都将在
server.js
. 因此,如果您看一下这个,那么您实际上可以了解问题的全貌
app.get('/systems/parsed', async(req, res) => {
const Sample = await Sample()
//Fetch the data from an API
const systems = await Cache.remember('systems', async() => {
return Sample.systems()
})
const integration = await IntegrationInstance()
/** GET THE RESPONSE DATA AND PUT THEM IN A CSV FILE*/
const result = await integration.generateCsvToBuffer(systems)
const aws = await AwsInstance()
/*** GET THE SYSTEMS FILE (CSV FILE) THEN UPLOAD THEM INTO THE AWS S3 BUCKET*/
const awsUpload = await aws.uploadWorkedWithBuffer(result)
return res.send(awsUpload);
})
我唯一担心的是,文件已成功上传到 Amazon AWS S3,但文件的内容仍在 Buffer 中。对现有功能/任何更短方式的任何帮助将不胜感激。
这是我的总结:从服务器获取数据 -> 将 Csv 文件作为缓冲区但从 Web 浏览器放入 -> 并从那里将其上传到 Amazon AWS S3 存储桶 -> 问题是文件已上传,但文件的内容是还在缓冲中。
解决方案
看起来你在这里让事情变得比必要的更复杂。根据文档.upload您可以将缓冲区直接传递给上传,而不是从缓冲区创建流。我怀疑您的潜在问题是从流中传递路径而不是流本身。
推荐阅读
- javascript - 如何正确地将 scrollTo 位置添加到函数当前函数中
- python - ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject
- gulp - 为 Bootstrap、SASS 和 BrowserSync 设置 Gulp 4
- python-3.x - python用cv2拍照-脏图片
- perl - 如何在不干扰格式的情况下对数字进行排序
- python - 使用二进制信息有效地保存 4D 数组
- reactjs - 如何在 Next.js 中执行客户端数据获取
- mysql - Mysql INNER JOIN 在 LEFT OUTER JOIN 之后
- android - 在 Flutter 和 iOS 中使用可变主机进行深度链接
- sql - 如何将此使用连接语句的查询转换为使用子查询的查询?