Speichern und abholen von Dateien mit Amazon S3 und PHP
Dieses Tutorial zeigt dir, wie du Dateien mithilfe von PHP in Amazon S3 speichern und darauf zugreifen kannst. Amazon S3 ist ein skalierbarer, zuverlässiger und einfach zu verwendender Cloud-Speicherdienst. Wir werden die AWS SDK für PHP verwenden, um mit S3 zu interagieren.
Voraussetzungen:
- Ein AWS-Konto: Melde dich bei AWS an oder erstelle ein neues Konto auf aws.amazon.com.
- AWS-Zugriffsschlüssel: Erstelle Zugriffsschlüssel in der AWS Management Console unter „IAM“.
- In der AWS Management Konsole ein Bucket erstellen. Wähle einen eindeutigen Bucket-Namen und die AWS-Region aus.
- Stelle sicher, dass du Composer auf deinem System installiert hast. Du kannst die Installationsanweisungen auf der Composer-Website finden: https://www.getcomposer.com/
- AWS SDK für PHP installieren: Installiere die AWS SDK für PHP mit Composer:
Öffne die Konsole und navigiere zum Wurzelverzeichnis deines PHP-Projekts.
Führe den folgenden Befehl aus:
composer require aws/aws-sdk-php
Composer lädt die neueste Version der AWS SDK für PHP herunter und installiert sie in den Vendor-Ordner.
Danach kannst du die SDK in deinem PHP-Code verwenden:
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
// ... dein Code mit der AWS SDK ...
?>
Schritt 1: Konfiguration der AWS SDK für PHP
Erstelle eine PHP-Datei namens config.php
und füge die AWS SDK-Konfiguration mit deinen Zugriffsschlüsseln hinzu:
<?php
require 'vendor/autoload.php'; // Pfade entsprechend anpassen
use Aws\S3\S3Client;
// AWS-Zugriffskonfiguration
return [
'region' => 'your-region', // z.B. 'eu-central-1'
'version' => 'latest',
'credentials' => [
'key' => 'your-access-key',
'secret' => 'your-secret-key',
],
];
?>
Schritt 2: Hochladen einer Datei zu Amazon S3 in die Cloud
Entweder nimmst du zu Testzwecke ein statisches File oder wie in unserem Fall ein einfaches HTML-Formular um Dateien hochzuladen, die dann in der Cloud gespeichert werden.
1. HTML-Formular erstellen:
Erstelle ein HTML-Formular mit einem <input type="file">
-Feld, in dem der Benutzer die Datei auswählen kann. Das Formular sollte an ein PHP-Skript gesendet werden, das die hochgeladene Datei verarbeitet.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Datei zu S3 hochladen</title>
</head>
<body>
<h1>Datei zu S3 hochladen</h1>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" required>
<button type="submit">Hochladen</button>
</form>
</body>
</html>
2. PHP-Skript zum Verarbeiten der Datei:
Das PHP-Skript empfängt die hochgeladene Datei und verwendet die AWS SDK, um sie auf S3 hochzuladen. Das Skript kann auch weitere Aktionen ausführen, z. B. die Dateieigenschaften speichern oder eine Benachrichtigung versenden.
Erstelle dafür eine PHP-Datei mit dem Namen upload.php
, um eine Datei in Amazon S3 hochzuladen:
<?php
require 'config.php';
// Verbindung zum S3-Client herstellen
$s3 = new S3Client($config);
// Prüfen, ob die Datei hochgeladen wurde
if (isset($_FILES['file'])) {
$file = $_FILES['file'];
// Dateiname extrahieren
$fileName = $file['name'];
// S3-Bucket und Key definieren
$bucket = 'your-bucket-name'; // Bitte anpassen
$key = basename($fileName);
// Temporären Dateipfad erstellen
$tmpFilePath = sys_get_temp_dir() . '/' . $key;
// Datei in temporären Pfad verschieben
if (move_uploaded_file($file['tmp_name'], $tmpFilePath)) {
// Datei auf S3 hochladen
try {
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => $key,
'SourceFile' => $tmpFilePath,
'ACL' => 'public-read' // Öffentlicher Zugriff auf die Datei
]);
// Erfolgsmeldung ausgeben
echo "Datei \"{$fileName}\" wurde erfolgreich hochgeladen. Öffentlicher Link: {$result['ObjectURL']}";
// Temporäre Datei löschen
unlink($tmpFilePath);
} catch (Aws\Exception\AwsException $e) {
// Fehlermeldung ausgeben
echo "Fehler beim Hochladen der Datei: {$e->getMessage()}";
}
} else {
// Fehler beim Verschieben der Datei
echo "Fehler beim Verschieben der temporären Datei.";
}
} else {
// Keine Datei ausgewählt
echo "Bitte wähle eine Datei zum Hochladen aus.";
}
?>
Erläuterung:
- Das HTML-Formular enthält ein
<input type="file">
-Feld und einen Submit-Button. - Das PHP-Skript prüft, ob die Datei hochgeladen wurde.
- Wenn die Datei hochgeladen wurde, wird sie in einen temporären Ordner verschoben.
- Die Datei wird dann mit der AWS SDK auf S3 hochgeladen.
- Bei Erfolg wird eine Erfolgsmeldung ausgegeben, andernfalls eine Fehlermeldung.
- Die temporäre Datei wird nach dem Hochladen gelöscht.
Schritt 3: Zugriff auf die hochgeladene Datei
Nachdem du eine Datei mithilfe des Tutorials auf Amazon S3 hochgeladen hast, kannst du über den öffentlichen Link, der automatisch generiert wird, auf sie zugreifen. Dieser Link ermöglicht es dir, die Datei in verschiedenen Kontexten zu verwenden, z. B. in Websites, Apps oder E-Mails.
1. Abrufen des öffentlichen Links:
Der öffentliche Link zur hochgeladenen Datei wird in der $objectUrl
-Variable gespeichert. Die Variable enthält den kompletten URL, der aus folgenden Teilen besteht:
- Protokoll:
https://
- S3-Bucket-Name:
your-bucket-name
(Ersetze dies durch den Namen deines S3-Buckets) - S3-Region:
s3-your-region.amazonaws.com
(Ersetzeyour-region
durch deine AWS-Region, z. B.eu-central-1
für Frankfurt) - Pfad zur Datei:
/path/to/your/file.jpg
(Ersetze dies durch den Pfad und Dateinamen deiner hochgeladenen Datei)
2. Verwendung des Links in HTML:
Im Beispielcode wird der öffentliche Link verwendet, um ein Bild in einer HTML-Seite anzuzeigen. Dazu wird das <img>
-Tag verwendet, dessen src
-Attribut auf den $objectUrl
gesetzt ist. Der alt
-Attribut enthält eine alternative Beschreibung für das Bild, falls es nicht geladen werden kann.
<?php
// Öffentlicher Link zur hochgeladenen Datei
$objectUrl = 'https://your-bucket-name.s3-your-region.amazonaws.com/path/to/your/file.jpg';
// Beispiel für die Verwendung des Links
echo "<img src='{$objectUrl}' alt='Hochgeladenes Bild'>";
// Alternativ: Direkter Link oder Download-Button
echo "<a href='{$objectUrl}'>Datei herunterladen</a>";
?>
3. Alternative Verwendungen des Links:
Neben der Verwendung in HTML kannst du den öffentlichen Link auch für andere Zwecke nutzen:
- Direkter Download: Füge den Link in eine E-Mail oder einen Text ein, damit Benutzer die Datei direkt herunterladen können.
- Download-Button: Erstelle in deiner Anwendung einen Button, der beim Klicken den Link öffnet und die Datei herunterlädt.
- API-Zugriff: Integriere den Link in eine API, um anderen Anwendungen den Zugriff auf die Datei zu ermöglichen.
Wichtig:
- Der öffentliche Link gewährt standardmäßig öffentlichen Zugriff auf die Datei. Stelle sicher, dass dies deinen Sicherheitsanforderungen entspricht. Du kannst die Zugriffsrechte in den S3-Bucket-Einstellungen konfigurieren.
- Der Link ist zeitlich unbegrenzt gültig. Du kannst ihn jedoch jederzeit in der S3-Konsole oder mithilfe der AWS SDK löschen.
- Achte auf die Benennung deiner Dateien. Verwende eindeutige und aussagekräftige Namen, um den Zugriff auf deine Dateien zu erleichtern.
Extra Tipp: Herunterladen von Dateien aus Amazon S3
Um Dateien aus deinem S3-Bucket herunterzuladen, kannst du die Methode getObject
verwenden. Diese Methode ermöglicht es dir, die Datei direkt auf deinen lokalen Server oder an einen gewünschten Speicherort herunterzuladen.
Erstelle ein PHP-Skript
Erstelle eine weitere PHP-Datei download.php
und ein PHP-Skript, das die getObject
-Methode verwendet, um die Datei herunterzuladen. Definiere die Parameter: Lege die folgenden Parameter für die getObject
-Methode fest:
Bucket
: Der Name deines S3-Buckets.Key
: Der Pfad und Name der Datei in deinem S3-Bucket.SaveAs
: Der Pfad und Dateiname, unter dem die Datei auf deinem Server gespeichert werden soll.
Verwende getObject
: Rufe die getObject
-Methode auf und übergebe die Parameter. Die Methode gibt ein Objekt vom Typ Aws\S3\StreamWrapper
zurück.
Speichere die Datei: Öffne eine Datei im Zielverzeichnis im Schreibmodus und lese die Daten aus dem StreamWrapper
-Objekt, um die Datei auf deinem Server zu speichern.
Beispielcode:
<?php
require 'config.php';
// Verbindung zum S3-Client herstellen
$s3 = new S3Client($config);
// Parameter definieren
$bucket = 'your-bucket-name';
$key = 'path/to/your/file.jpg';
$saveAs = '/path/to/save/file.jpg';
// Datei herunterladen
try {
$result = $s3->getObject([
'Bucket' => $bucket,
'Key' => $key,
'SaveAs' => $saveAs
]);
echo "Datei \"{$key}\" erfolgreich heruntergeladen.";
} catch (Aws\Exception\AwsException $e) {
echo "Fehler beim Herunterladen der Datei: {$e->getMessage()}";
}
?>
Viel Erfolg bei deinem Projekt!
Hast du noch Fragen, benötigst Hilfe oder hast gar einen Fehler entdeckt?
Wenn du Fragen zu diesem Tutorial hast oder Unterstützung beim Arbeiten mit Amazon S3 und PHP benötigst, zögere nicht, einen Kommentar zu hinterlassen!
Kommentare
Zum upload wird die Methode POST verwendet, die jedoch über CloudFront nicht erlaubt ist und daher wird der Vorgang mit einer entsprechender Fehlermeldung „MethodeNotAllowed“ abgebrochen. Was muss ich tun, damit trotzdem ein upload auf den S3 Speicher erolgen kann? – vielen Dank!
Hallo Norbert, dann empfehle ich dir eine vorgesignierte URL (Presigned URL) in Kombination mit einem JavaScript-basierten Upload.
Siehe hier: Uploading objects with presigned URLs
Weitere Beiträge
Kontaktformular mit PHP
TYPO3 | Breadcrumb Navigation mit Startseiten Icon
Eine eigene TYPO3 Extension (Extbase/Fluid) mit System Kategorien erstellen (Teil 2)
TYPO3 Backend Editor in eigener Extension nutzen