如何显示存储在 aws s3 存储桶中的产品图像
How to display images of products stored on aws s3 bucket
我正在练习本教程
https://www.youtube.com/watch?v=NZElg91l_ms&t=1234s
它对我来说绝对是一种魅力,但问题是我正在存储产品图像,我将它们存储在存储桶中,假设我上传了 4 张图像,它们都已上传。
但是当我显示它们时,我收到拒绝访问错误,因为我正在显示列表并且重复请求可能将其检测为垃圾邮件
这就是我试图在我的 React 应用程序上获取它们的方式
//其余数据来自mysql数据库(产品名称,价格)
//100+ 产品
{ products.map((row)=>{
<div className="product-hero"><img src=`http://localhost:3909/images/${row.imgurl}`</div>
<div className="text-center">{row.productName}</div>
})
}
因为它从数据库中获取了 100 多个产品并从 aws 中获取了 100 个图像,所以它失败了
很抱歉提出如此详细的问题,但简而言之,我如何才能从我的存储桶中获取所有产品图片
注意我知道我每次调用只能获取一张图像,所以如何在我的场景中一张一张地获取所有图像
//下载我的代码app.js
const { uploadFile, getFileStream } = require('./s3')
const app = express()
app.get('/images/:key', (req, res) => {
console.log(req.params)
const key = req.params.key
const readStream = getFileStream(key)
readStream.pipe(res)
})
//s3文件
// uploads a file to s3
function uploadFile(file) {
const fileStream = fs.createReadStream(file.path)
const uploadParams = {
Bucket: bucketName,
Body: fileStream,
Key: file.filename
}
return s3.upload(uploadParams).promise()
}
exports.uploadFile = uploadFile
// downloads a file from s3
function getFileStream(fileKey) {
const downloadParams = {
Key: fileKey,
Bucket: bucketName
}
return s3.getObject(downloadParams).createReadStream()
}
exports.getFileStream = getFileStream
我在处理我博客的图片上传功能时做了类似的 S3 图像处理,但我没有使用 getFileStream() 来上传我的图片。
因为在图像文件完全处理之前什么都不应该做,所以我使用 fs.readFile(path, callback)
来读取数据。
我的方法将生成缓冲区数据,但 AWS S3 足够聪明,知道将其作为图像拦截。 (我只是在文件名中添加了后缀,我不知道如何应用图像headers...)
这是我的部分代码供参考:
fs.readFile(imgPath, (err, data) => {
if (err) { throw err }
// Once file is read, upload to AWS S3
const objectParams = {
Bucket: 'yuyuichiu-personal',
Key: req.file.filename,
Body: data
}
S3.putObject(objectParams, (err, data) => {
// store image link and read image with link
}
}
您的代码似乎正在向您的后端发送图像请求,后端从 Amazon S3 检索对象,然后提供图像以响应请求。
更好的方法是让 HTML 页面中的 URL 直接 指向存储在 Amazon S3 中的图像。这将是高度可扩展的,并且会减少您的网络服务器上的负载。
这将要求图像为 public,以便用户的 Web 浏览器可以检索图像。最简单的方法是添加一个 桶策略 授予所有用户 GetObject
访问权限。
或者,如果您不想创建存储桶 public,您可以生成 Amazon S3 pre-signed URLs,它们是有时间限制的 URLs,提供对私有的临时访问目的。您的后端可以使用几行代码计算预签名 URL,然后用户的 Web 浏览器将能够从 S3 检索私有对象以显示在页面上。
我正在练习本教程 https://www.youtube.com/watch?v=NZElg91l_ms&t=1234s
它对我来说绝对是一种魅力,但问题是我正在存储产品图像,我将它们存储在存储桶中,假设我上传了 4 张图像,它们都已上传。 但是当我显示它们时,我收到拒绝访问错误,因为我正在显示列表并且重复请求可能将其检测为垃圾邮件
这就是我试图在我的 React 应用程序上获取它们的方式 //其余数据来自mysql数据库(产品名称,价格) //100+ 产品
{ products.map((row)=>{
<div className="product-hero"><img src=`http://localhost:3909/images/${row.imgurl}`</div>
<div className="text-center">{row.productName}</div>
})
}
因为它从数据库中获取了 100 多个产品并从 aws 中获取了 100 个图像,所以它失败了
很抱歉提出如此详细的问题,但简而言之,我如何才能从我的存储桶中获取所有产品图片
注意我知道我每次调用只能获取一张图像,所以如何在我的场景中一张一张地获取所有图像
//下载我的代码app.js
const { uploadFile, getFileStream } = require('./s3')
const app = express()
app.get('/images/:key', (req, res) => {
console.log(req.params)
const key = req.params.key
const readStream = getFileStream(key)
readStream.pipe(res)
})
//s3文件
// uploads a file to s3
function uploadFile(file) {
const fileStream = fs.createReadStream(file.path)
const uploadParams = {
Bucket: bucketName,
Body: fileStream,
Key: file.filename
}
return s3.upload(uploadParams).promise()
}
exports.uploadFile = uploadFile
// downloads a file from s3
function getFileStream(fileKey) {
const downloadParams = {
Key: fileKey,
Bucket: bucketName
}
return s3.getObject(downloadParams).createReadStream()
}
exports.getFileStream = getFileStream
我在处理我博客的图片上传功能时做了类似的 S3 图像处理,但我没有使用 getFileStream() 来上传我的图片。
因为在图像文件完全处理之前什么都不应该做,所以我使用 fs.readFile(path, callback)
来读取数据。
我的方法将生成缓冲区数据,但 AWS S3 足够聪明,知道将其作为图像拦截。 (我只是在文件名中添加了后缀,我不知道如何应用图像headers...)
这是我的部分代码供参考:
fs.readFile(imgPath, (err, data) => {
if (err) { throw err }
// Once file is read, upload to AWS S3
const objectParams = {
Bucket: 'yuyuichiu-personal',
Key: req.file.filename,
Body: data
}
S3.putObject(objectParams, (err, data) => {
// store image link and read image with link
}
}
您的代码似乎正在向您的后端发送图像请求,后端从 Amazon S3 检索对象,然后提供图像以响应请求。
更好的方法是让 HTML 页面中的 URL 直接 指向存储在 Amazon S3 中的图像。这将是高度可扩展的,并且会减少您的网络服务器上的负载。
这将要求图像为 public,以便用户的 Web 浏览器可以检索图像。最简单的方法是添加一个 桶策略 授予所有用户 GetObject
访问权限。
或者,如果您不想创建存储桶 public,您可以生成 Amazon S3 pre-signed URLs,它们是有时间限制的 URLs,提供对私有的临时访问目的。您的后端可以使用几行代码计算预签名 URL,然后用户的 Web 浏览器将能够从 S3 检索私有对象以显示在页面上。