Arbeit mit S3 und Cloud-Speichern in JavaScript (Node.js)
\n\nS3 (Simple Storage Service) ist der De-facto-Standard für Objektspeicher in der Cloud. Unabhängig davon, ob Sie Amazon S3, Yandex Object Storage, Mail.ru Cloud Storage oder eine lokale Lösung wie MinIO verwenden, die API bleibt einheitlich. In diesem Artikel werden wir uns ansehen, wie man mit dem offiziellen AWS SDK v3 von Node.js aus eine Verbindung zu S3-kompatiblen Speichern herstellt.
\n\nWas ist S3 und wozu wird es benötigt?
\nS3 ermöglicht die Speicherung einer unbegrenzten Anzahl von Dateien (Objekten) in „Buckets". Jedes Objekt hat einen eindeutigen Schlüssel (Pfad) und Metadaten. Die wichtigsten Anwendungsszenarien sind:
\n- \n
- Speicherung von Benutzerdateien (Avatare, Dokumente) \n
- Backups von Datenbanken und Logs \n
- Statische Dateien für Webanwendungen (Bilder, CSS, JS) \n
- Speicherung von Mediendateien (Video, Audio) \n
Installation und Konfiguration des AWS SDK v3
\nAb Version 3 ist das AWS SDK modular aufgebaut. Für die Arbeit mit S3 reicht die Installation eines Pakets:
\nnpm install @aws-sdk/client-s3\n\nAußerdem benötigen Sie Umgebungsvariablen mit den Zugriffsschlüsseln. Am besten speichern Sie diese in einer .env-Datei:
AWS_ACCESS_KEY_ID=your_access_key\nAWS_SECRET_ACCESS_KEY=your_secret_key\nAWS_REGION=ru-central1\nS3_ENDPOINT=https://storage.yandexcloud.net\nS3_BUCKET=my-bucket\n\nVerbindung zu einem S3-kompatiblen Speicher herstellen
\nErstellen wir einen S3-Client mit einem benutzerdefinierten Endpunkt (für Yandex Object Storage, MinIO und andere):
\nconst { S3Client } = require('@aws-sdk/client-s3');\nrequire('dotenv').config();\n\nconst s3Client = new S3Client({\n region: process.env.AWS_REGION,\n endpoint: process.env.S3_ENDPOINT,\n credentials: {\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n },\n forcePathStyle: true, // wichtig für MinIO und einige S3-kompatible Speicher\n});\n\nmodule.exports = s3Client;\n\nGrundlegende Operationen mit S3
\n\n1. Datei hochladen (PutObject)
\nLaden Sie eine Datei aus einem Buffer oder Stream hoch:
\nconst { PutObjectCommand } = require('@aws-sdk/client-s3');\nconst fs = require('fs');\n\nasync function uploadFile(filePath, key) {\n const fileContent = fs.readFileSync(filePath);\n \n const command = new PutObjectCommand({\n Bucket: process.env.S3_BUCKET,\n Key: key,\n Body: fileContent,\n ContentType: 'image/png', // geben Sie den korrekten MIME-Typ an\n });\n\n try {\n const response = await s3Client.send(command);\n console.log('Datei hochgeladen:', response.$metadata.httpStatusCode);\n return `https://storage.yandexcloud.net/${process.env.S3_BUCKET}/${key}`;\n } catch (err) {\n console.error('Fehler beim Hochladen:', err);\n }\n}\n\n2. Datei herunterladen (GetObject)
\nObjekt abrufen und lokal speichern:
\nconst { GetObjectCommand } = require('@aws-sdk/client-s3');\nconst fs = require('fs');\nconst stream = require('stream');\nconst { promisify } = require('util');\nconst pipeline = promisify(stream.pipeline);\n\nasync function downloadFile(key, destinationPath) {\n const command = new GetObjectCommand({\n Bucket: process.env.S3_BUCKET,\n Key: key,\n });\n\n try {\n const response = await s3Client.send(command);\n const writeStream = fs.createWriteStream(destinationPath);\n await pipeline(response.Body, writeStream);\n console.log('Datei heruntergeladen:', destinationPath);\n } catch (err) {\n console.error('Fehler beim Herunterladen:', err);\n }\n}\n\n3. Liste der Objekte abrufen (ListObjectsV2)
\nNützlich zur Anzeige von Dateien in einem Bucket:
\nconst { ListObjectsV2Command } = require('@aws-sdk/client-s3');\n\nasync function listFiles(prefix = '') {\n const command = new ListObjectsV2Command({\n Bucket: process.env.S3_BUCKET,\n Prefix: prefix,\n MaxKeys: 100,\n });\n\n try {\n const response = await s3