图像缩略图云 (Node.js + AWS)

图像缩略图云 (Node.js + AWS)

qiniu有免费的云存储使用,也挺方便的

4 回复

图像缩略图云 (Node.js + AWS)

在这个帖子中,我们将探讨如何利用Node.js和AWS服务来创建一个图像缩略图云。我们将使用AWS S3作为存储服务,并使用Lambda函数来生成缩略图。

准备工作

  1. 安装必要的依赖: 首先,我们需要安装一些Node.js包来处理文件上传、缩放和S3操作。我们可以使用aws-sdk来与AWS S3进行交互,以及sharp库来处理图像缩放。

    npm install aws-sdk sharp
    
  2. 配置AWS凭证: 在你的项目根目录下创建一个.env文件,并添加AWS访问密钥和秘密密钥:

    AWS_ACCESS_KEY_ID=your_access_key_id
    AWS_SECRET_ACCESS_KEY=your_secret_access_key
    

    确保这些凭证是安全的,不要直接暴露在代码中。

实现步骤

  1. 上传原始图片到S3: 创建一个简单的API端点,允许用户上传原始图片到S3。

    const AWS = require('aws-sdk');
    const s3 = new AWS.S3();
    const express = require('express');
    const app = express();
    
    app.post('/upload', async (req, res) => {
        const file = req.files.file;
        const params = {
            Bucket: 'your-bucket-name',
            Key: file.name,
            Body: file.data,
            ContentType: file.mimetype
        };
        try {
            await s3.upload(params).promise();
            res.status(200).json({ message: 'File uploaded successfully' });
        } catch (err) {
            res.status(500).json({ error: err.message });
        }
    });
    
    app.listen(3000, () => console.log('Server started on port 3000'));
    
  2. 创建AWS Lambda函数生成缩略图: 使用AWS Lambda创建一个函数,该函数将从S3获取原始图片并生成缩略图。

    const AWS = require('aws-sdk');
    const s3 = new AWS.S3();
    const sharp = require('sharp');
    
    exports.handler = async (event) => {
        const key = event.Records[0].s3.object.key;
        const buffer = await s3.getObject({ Bucket: 'your-bucket-name', Key: key }).promise();
        const thumbnailBuffer = await sharp(buffer.Body).resize(200, 200).toBuffer();
    
        const thumbnailParams = {
            Bucket: 'your-bucket-name',
            Key: `thumbnails/${key}`,
            Body: thumbnailBuffer,
            ContentType: 'image/jpeg'
        };
    
        try {
            await s3.putObject(thumbnailParams).promise();
            return { statusCode: 200, body: JSON.stringify({ message: 'Thumbnail created successfully' }) };
        } catch (err) {
            return { statusCode: 500, body: JSON.stringify({ error: err.message }) };
        }
    };
    
  3. 配置S3事件触发器: 在S3桶上配置事件触发器,当有新的对象被上传时触发Lambda函数。

通过以上步骤,我们就可以实现一个基本的图像缩略图云系统。用户上传图片后,系统会自动在后台生成缩略图并存储在同一S3桶中。这样不仅提高了用户体验,还减少了带宽消耗和服务器负载。


七牛/又拍是不错,但前提是用户要把图片存在他们那里。

而使用缩略图云,用户可以把图像存储在网络上任何可信赖的地方,如亚马逊S3、微软云、阿里云、腾讯云、各种云存储、各种网盘等,当然更可以保存在自己的服务器上,只需要向缩略图云发送一个标准的HTTP请求,就可以实时获得自定义的缩略图。同样,你还可以把返回的缩略图保存在任何可信赖的地方。

总之,使用图像缩略图云服务,更少约束、更多自由;更少风险,更多安心。 :)

七牛云也有图片存自己服务器的模式啊

针对“图像缩略图云 (Node.js + AWS)”这个主题,我们可以使用AWS S3来存储图像,并利用sharp库来生成缩略图。下面是实现这一功能的具体步骤:

  1. 创建S3 Bucket: 首先需要在AWS管理控制台中创建一个S3存储桶,用于存储原始图像和生成的缩略图。

  2. 安装必要的库: 使用npm install aws-sdk sharp命令安装AWS SDK和Sharp库。

  3. 上传原始图像并生成缩略图:

    • 上传原始图像到S3存储桶。
    • 从S3下载原始图像。
    • 使用sharp处理图像以生成缩略图。
    • 将生成的缩略图重新上传到S3存储桶。

以下是一些关键代码示例:

const AWS = require('aws-sdk');
const sharp = require('sharp');

// 配置AWS SDK
AWS.config.update({
    accessKeyId: 'YOUR_ACCESS_KEY_ID',
    secretAccessKey: 'YOUR_SECRET_ACCESS_KEY',
    region: 'us-east-1' // 或者其他区域
});

const s3 = new AWS.S3();
const bucketName = 'your-bucket-name';

// 上传原始图像
async function uploadImageToS3(imagePath) {
    const params = {
        Bucket: bucketName,
        Key: 'original/' + imagePath.split('/').pop(),
        Body: fs.createReadStream(imagePath),
        ContentType: 'image/jpeg'
    };
    await s3.upload(params).promise();
}

// 生成缩略图
async function generateThumbnail(originalKey, thumbnailKey) {
    const data = await s3.getObject({Bucket: bucketName, Key: originalKey}).promise();
    
    const resizedBuffer = await sharp(data.Body)
        .resize(150, 150) // 设置缩放后的宽度和高度
        .toFormat('jpeg') // 设置输出格式
        .toBuffer();

    await s3.putObject({
        Bucket: bucketName,
        Key: thumbnailKey,
        Body: resizedBuffer,
        ContentType: 'image/jpeg'
    }).promise();
}

// 示例调用
uploadImageToS3('./path/to/your/image.jpg')
    .then(() => generateThumbnail('original/image.jpg', 'thumbnail/image.jpg'))
    .catch(console.error);

这段代码展示了如何使用Node.js、AWS SDK和Sharp库来上传图像到S3,然后从S3下载图像、生成缩略图并将其保存回S3。确保将YOUR_ACCESS_KEY_IDYOUR_SECRET_ACCESS_KEYbucketName替换为实际值。

回到顶部