Я использую официальный PHP SDK с официальным поставщиком услуг для laravel для загрузки изображения на Amazon S3. Изображение временно сохраняется на моем сервере и должно быть удалено после загрузки. Ниже приведен код, который я использовал для загрузки и удаления.
$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);
Загрузка выполнена успешно. Я вижу изображение с возвратом ссылки, и я вижу это на консоли amazon. Проблема заключается в том, что удаление завершилось неудачно, со следующим сообщением об ошибке:
ErrorException: unlink(... path of my file ...): Permission denied
Я уверен, что мои настройки разрешений для файлов верны, и я могу удалить свой файл с разделом кода для загрузки в комментарий S3. Поэтому проблема заключается в том, что файл заблокирован при загрузке файла. Есть ли способ разблокировать и удалить файл?
Да, потоковая загрузка блокирует файл до его завершения, попробуйте либо 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);
или
$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);
Когда вы используете опцию SourceFile
в putObject
S3Client открывает файл, но не закрывает его после операции.
В большинстве случаев вы можете отключить $client
и / или $result
чтобы закрыть открытые файлы. Но, к сожалению, не в этом случае.
Используйте опцию Body
вместо 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);
EDIT: Я заметил, что строка в вашем temp_path начинается с символа «/». Эта начальная косая черта обычно начинается в корневом каталоге веб-сайта, вы уверены, что это правильное местоположение? Используйте команду getcwd () в PHP, чтобы узнать, какая папка PHP считает, что она внутри.
Я понимаю, вы считаете, что разрешения правильные, но в свете ошибки «отказа от разрешения» я все еще верю, что это говорит вам что-то актуальное.
Я вижу, вы пытаетесь использовать каталог, возможно, вы хотите это сделать? Если вы можете использовать SSH на своем сервере и запустить эту команду, вам может быть повезло больше:
chmod -R 777 /(your-website-dir/screenshot_temp
Или даже попробуйте изменить «chown» на «chmod» в вашем PHP-коде.
Я не парень PHP, но я бы попробовал выпустить этого плохого мальчика в поток, а затем передать поток в SDK.
Таким образом, вы можете явно закрыть поток, а затем удалить временный файл. Вы даже можете полностью удалить временный файл и работать исключительно с потоками, если это разрешено вашим конкретным прецедентом.
Похоже, это сообщение SO может поставить вас на правильный трек.