Загрузить CSV-файл в AWS S3 Bucket непосредственно с сервера - PullRequest
0 голосов
/ 08 июня 2019

Счастливых выходных все,

Я работаю над задачей, которая извлекает данные из 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, но содержимое файла все еще находится в буфере.Любая помощь по существующей функции / любой более короткий путь был бы очень признателен.

  • Вот мое резюме еще раз: получить данные с сервера -> поместить файл Csv в качестве буфера, НО извеб-браузер -> и оттуда загрузите его в корзину Amazon AWS S3 -> Проблема в том, что файл загружен, но содержимое файла все еще находится в буфере.

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Я действительно решил это.

  • Во-первых, всякий раз, когда вы создавали функцию generateCsvToBuffer, не забывайте иметь bookType на вашей wb (рабочей книге), чтобы s3 мог ее распознать.Функция должна выглядеть примерно так:
    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', bookType: 'csv'})

            return csvParsed;
    }
  • Во-вторых, вам необходимо импортировать Content-Disposition: attachment в uploadParams для конфигурации Aws
 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')
          }
        })
    }

0 голосов
/ 08 июня 2019

Похоже, что вы делаете вещи более сложными, чем необходимо здесь. Согласно документации .upload вы можете передать буфер для загрузки напрямую, вместо создания потока из буфера. Я подозреваю, что ваша основная проблема заключается в передаче пути из потока, а не самого потока.

...