AWS S3 图像 URL 显示破解图像

问题描述 投票:0回答:0

请原谅我,如果我问得很愚蠢。我是 AWS 和无服务器框架的新手,但我的问题是相同的代码(用 Express js 编写,不使用任何无服务器逻辑,并且对于此代码,有一个单独的 ELASTIC BEANSTALK 后端)能够将图像上传到 AWS s3 并生成图像url 在浏览器中显示图像,但是使用无服务器框架配置的相同代码(有用于此的 LAMDA 功能)也能够将图像上传到 aws s3(对于两种情况存储桶相同),但这次结果图像 url 仅显示裂纹图像(我的意思是每当图像无法打开时,默认图像就是这样的)。在这两种情况下,我在上传到 s3 后得到一个图像 url,并且该 url 包含其他文本数据,我存储在我的 aws rds mysql db 中

**我的 serverless.Yaml 文件 **

service: serverlessbackend
frameworkVersion: "3"

provider:
  name: aws
  runtime: nodejs18.x
  region: ap-south-1
  timeout: 10
  environment:
    DB_HOST: "something.rds.amazonaws.com"
    DB_USER: "user"
    DB_PASSWORD: "something"
    DB_NAME: "something"
    AWS_ACCESSKEY: "something"
    AWS_SECRETKEY: "something"
    MY_AWS_REGION: "ap-south-1"


functions:
  myLambdaFunction:
    handler: index.handler
    events:
      - http: ANY /
      - http: "ANY {proxy+}"

plugins:
  - serverless-offline

index.js 文件

const serverless = require("serverless-http");
const express = require("express");
const app = express();
const mysql = require("mysql2");
app.use(express.json());
let pool = require("./db/index");

let categoryRoutes = require("./routes/categoryRoutes");


app.use("/category", categoryRoutes);



module.exports.handler = serverless(app);

** Categoryroutes.js 文件 **

const express = require("express");
const { pool } = require("../db");
const { deleteFromAws, uploadToAws } = require("../utils/aws");
const multer = require("multer");
const { uniqueString } = require("../utils/unique");

const router = express.Router();


const storage = multer.memoryStorage();

const upload = multer({
  storage: storage,
});


router.post("/", upload.single("image"), async (req, res) => {

  console.log(req.file);
  if (!req.file) {
    return res.status(400).json({ error: "No file uploaded" });
  }

  try {
  
    let result = await uploadToAws(req.file);
  
    let { Location: imgUrl, Key } = result;

    console.log(result);
  

    if (imgUrl && Key) {
      const query = "INSERT INTO temp SET ?";

      const data = {
        category: req.body.category,
        category_id: uniqueString(),
        image_path: imgUrl,
        image_name: Key,
      };
      // The "?" in the query is a placeholder for the data object

      pool.query(query, data, (err, result) => {
        if (err) {
          console.log(err);
          return res.status(400).json({ message: err.message });
        }
        // console.log(result);
        return res.status(200).json({ message: "File uploaded successfully" });
      });
    } else {
      throw new Error("something wrong");
    }
  } catch (err) {
    console.log(err.message);
    res.send(err.message);
  }
});

这里上传到aws文件:

const AWS = require("aws-sdk");
const { generateUniqueImageName } = require("./unique");

// Configure AWS credentials
AWS.config.update({
  accessKeyId: process.env.AWS_ACCESSKEY,
  secretAccessKey: process.env.AWS_SECRETKEY,
  region: process.env.MY_AWS_REGION, // e.g., 'us-east-1'
});

// Create a new instance of the S3 service

const uploadToAws = async (file) => {
  // console.log(file);
  
  const s3 = new AWS.S3();

  const params = {
    Bucket: "something",
    Key: `uploads/IMG-${generateUniqueImageName(file.originalname)}`, // The file name to be used in the S3 bucket
    ContentType: file.mimetype,
    Body: file.buffer, // The file content as a buffer
  };

  return await s3.upload(params).promise();
};

with serverless framework image url looks like this

without serverless, image url is showing image

我已经检查了我的访问密钥和秘密密钥,一切正常。

express amazon-s3 aws-lambda lambda serverless-framework
© www.soinside.com 2019 - 2024. All rights reserved.