2016-12-30 2 views
10

Ich verwende die official PHP SDK mit the official service provider for laravel, um ein Bild auf Amazon S3 hochzuladen. Das Bild wird vorübergehend auf meinem Server gespeichert und sollte nach dem Hochladen gelöscht werden. Der folgende Code ist der Code, den ich zum Hochladen und Löschen verwendet habe.Wie kann die Datei nach dem Hochladen der Datei durch AWS S3 Helper entsperrt werden?

$temp_path = "/screenshot_temp/testing.png"; 

$client = AWS::createClient('s3'); 
$result = $client->putObject(array(
     'Bucket'  => self::$bucketName, 
     'Key'  => 'screenshot/testing.png', 
     'SourceFile' => $temp_path, 
     'ACL' => 'public-read' 
    )); 
); 

chown($temp_path, 777); 
unlink($temp_path); 

Der Upload ist erfolgreich. Ich kann mein Bild mit dem Link zurück sehen, und ich kann es auf der Amazon Konsole sehen. Das Problem ist, dass das Löschen fehlschlägt, mit der folgenden Fehlermeldung:

ErrorException: unlink(... path of my file ...): Permission denied 

Ich bin sicher, dass meine Datei Erlaubnis Einstellung richtig ist, und ich bin der Lage, meine Datei mit dem Code-Abschnitt zu löschen, für das Hochladen, um S3 Kommentar . Es sollte also das Problem sein, dass die Datei beim Hochladen der Datei gesperrt ist. Gibt es eine Möglichkeit, meine Datei zu entsperren und zu löschen?

+0

Bucket-Objekte sind keine Dateien –

Antwort

6

Ja der Strom laden Sie die Datei sperrt, bis es fertig ist, versuchen entweder von 2,

$client = AWS::createClient('s3'); 
$fileContent = file_get_contents($temp_path); 
$result = $client->putObject(array(
    'Bucket'  => self::$bucketName, 
    'Key'  => 'screenshot/testing.png', 
    'Body'  => $fileContent, 
    'ACL'  => 'public-read' 
)); 
); 

unlink($temp_path); 

oder

$client = AWS::createClient('s3'); 
$fileContent = file_get_contents($temp_path); 
$result = $client->putObject(array(
    'Bucket'  => self::$bucketName, 
    'Key'  => 'screenshot/testing.png', 
    'Body'  => $fileContent, 
    'ACL'  => 'public-read' 
)); 
); 

gc_collect_cycles(); 
unlink($temp_path); 
+0

Erstens, ich denke, es sollte 'file_get_contents()' sein, sonst würde es in Funktion nicht gefunden werden.Und selbst wenn ich file_get_contents ändere, funktioniert der Code nicht. Die Funktion akzeptiert weiterhin '$ fileContent' als Dateipfad und return file not found. – cytsunny

+0

Meine schlechte, :(Korrigiert meinen Code. – Vineesh

+0

Nicht sicher für die zweite Methode, aber die erste funktioniert für mich. – cytsunny

1

EDIT: Ich habe gerade bemerkt, die Zeichenfolge in Ihrem $ Temp_Path beginnt mit einem "/"Schrägstrich-Zeichen. Dieser Anfangs-Schrägstrich beginnt normalerweise im Stammverzeichnis der Website. Sind Sie sicher, dass dies der richtige Speicherort ist? Verwenden Sie den Befehl getcwd() in PHP, um herauszufinden, in welchem ​​Ordner PHP sich befindet.

Ich verstehe, dass Sie glauben, dass die Berechtigungen korrekt sind, aber angesichts des Fehlers "Berechtigung verweigert" glaube ich immer noch, dass es Ihnen etwas Relevantes sagt.

Ich sehe, Sie versuchen, das Verzeichnis chown, haben Sie vielleicht chmod wollen? Wenn Sie auf Ihren Server SSH können und diesen Befehl ausführen können Sie mehr Glück:

chmod -R 777 /(your-website-dir/screenshot_temp 

Oder sogar versuchen, die „chown“ auf „chmod“ in Ihrem PHP-Code zu ändern.

+0

Dies ist eine falsche Position für Demo-Zwecke. Aus Sicherheitsgründen werde ich nicht den tatsächlichen Pfad. Die tatsächliche Pfad ist nicht im Wurzelverzeichnis, und ich bin mir sicher, dass der Pfad korrekt ist, da der Upload erfolgreich war. – cytsunny

+0

Ok für den Pfad. Aber haben Sie versucht, den falschen chown Befehl durch chmod zu ersetzen? – Seb

+0

Ich bin mir sicher, dass es auch korrekt ist Ich kann sehen, dass die Berechtigung geändert wird, wenn ich den "ls" -Befehl verwende. – cytsunny

3

Wenn Sie SourceFile Option unter putObject verwenden, öffnet S3Client eine Datei, schließt sie aber nach dem Betrieb nicht. In den meisten Fällen können Sie $client und/oder $result nur deaktivieren, um geöffnete Dateien zu schließen. Aber leider nicht in diesem Fall.

Verwenden Sie Body Option anstelle der SourceFile.

// temp file 
$file = fopen($temp_path, "r"); 

// use resource, not a path 
$result = $client->putObject(array(
     'Bucket'  => self::$bucketName, 
     'Key'  => 'screenshot/testing.png', 
     'Body'  => $file, 
     'ACL'  => 'public-read' 
    )); 
); 

fclose($file); 

unlink($temp_path); 
1

Ich bin kein PHP-Kerl, aber ich würde versuchen, die bösen Buben in einen Strom knallte und dann vorbei, den Strom zu dem SDK.

Auf diese Weise können Sie den Stream explizit schließen und dann die temporäre Datei löschen. Möglicherweise können Sie sogar die temporäre Datei vollständig löschen und nur mit Streams arbeiten, wenn dies für Ihren speziellen Anwendungsfall zulässig ist.

Sieht aus wie this SO post könnte Sie auf dem richtigen Weg setzen.

+0

Ja, und das ist die Art, wie andere Antwort vorschlagen. Ich bin nur überrascht, dass ein SDK geschrieben von Amazon bietet keine Methode, um den Stream zu schließen, oder einfach Schließen Sie den Stream standardmäßig ..... – cytsunny

Verwandte Themen