![](/img/trans.png)
[英]downloading image file from AWS S3 bucket using nodejs, UPDATE :12/12
[英]Downloading a pdf file from AWS S3 using NodeJS
我正在嘗試從 S3 下載 pdf 文件,但每次將其下載到本地計算機時,都會收到錯誤消息“錯誤:無法加載 PDF”。 看來我仍在下載 blob 而不是文件,但已經嘗試了所有方法並查看了太多的 stackoverflow 解決方案。
這是我下載 function 所在的后端代碼(對不起,它仍然很亂):后端 --> 中間件 --> amazon.js
const AWS = require('aws-sdk');
const fs = require('fs');
const uuid = require('uuid');
require('dotenv').config()
console.log("proccess", process.env.IAM_USER_KEY)
var dataUriToBuffer = require('data-uri-to-buffer');
const _path = require('path');
const { post } = require('../routes/user.data');
const { app } = require('firebase-admin');
const multer = require('multer');
var FileReader = require('filereader')
, fileReader = new FileReader
;
AWS.config.update({
accessKeyId: process.env.IAM_USER_KEY,
secretAccessKey: process.env.IAM_USER_SECRET,
region: 'us-east-1'
})
const s3 = new AWS.S3()
async function upload(req, res, next){
let key = req.params.source+"/"+req.params.data.fields.id;
// function to save the user uploaded file to "uploads" folder
const uploadFile = (fileName) => {
// Read content from the file
const fileContent = fs.readFileSync(fileName);
// Setting up S3 upload parameters
const params = {
Bucket: process.env.BUCKET,
Key: key, // File name you want to save as in S3
Body: fileContent
};
// Uploading files to the bucket
s3.upload(params, function(err, data) {
if (err) {
throw err;
}
console.log(`File uploaded successfully. ${data.Location}`);
});
};
var filePath = _path.resolve(req.params.data.file.name);
uploadFile(req.params.file_path)
}
async function download(req, res, next){
let report_object = req.body.object_id
report_object = report_object[0]
let source = req.body.source
let dir = _path.join(__dirname, '..', 'public')
let fileName = `${source}.pdf`
let filePath = _path.join(dir, fileName)
let writeStream = fs.createWriteStream(filePath)
var params = {
Key: source+"/"+report_object,
Bucket: process.env.BUCKET
}
const readStream = s3.getObject(params).createReadStream();
// Error handling in read stream
readStream.on("error", (e) => {
console.error(e);
reject(e);
});
readStream.pipe(writeStream);
writeStream.on('finish', () => {
res.download(dir + "/" + fileName)
})
}
module.exports = { upload, download }
這是我在前端找到並與后端通信的api接口中的下載function:
import axios from 'axios';
import fs from 'fs'
import streamToBlob from 'stream-to-blob'
async function upload(data, user){
data["user"] = user
await axios({
method: 'post',
url: 'http://localhost:3000/s3/upload',
data: data,
headers: { "content-type": "multipart/form-data"},
})
}
function download(id, source){
let data = axios.post("http://localhost:3000/s3/download", {object_id: id, source: source}, { headers : {'Accept' : "application/pdf"}}).then( (res) => {
let blob = new Blob([res.data], {type: 'application/pdf'})
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = `${source}`
link.click()
setTimeout(function() {
URL.revokeObjectURL(link.href)
}, 60000)
return
})
}
export {upload, download}
我相信當前的下載是一個 blob,因為我在開發檢查工具的網絡選項卡中看到了它。
預先感謝您的幫助。
不確定您使用的是什么版本的 AWS SDK。 使用@aws-sdk/client-s3
版本3.3.0
我能夠:
import { S3 } from '@aws-sdk/client-s3'
const express = require('express')
const expressInstance = express()
const s3Client = new S3({
region: '...',
credentials: {
accessKeyId: '...',
secretAccessKey: '...'
}
})
expressInstance.get('/durl', async (req, res) => {
const object = await s3Client.getObject({
Bucket: '...',
Key: decodeURIComponent(req.query.k)
}
object.Body.pipe(res)
})
...用一個簡單的前端JS:
const link = document.createElement('a')
link.href = '.../durl?k=my.pdf'
link.download = `my.pdf`
link.click()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.