Как разблокировать файл после загрузки файла AWS S3 Helper?

Я использую официальный 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 может поставить вас на правильный трек.