Вызов PHP unlink () после сбоя move_uploaded_file () для перемещенного файла - PullRequest
0 голосов
/ 28 февраля 2019

Я отправляю файлы, загруженные на мой сервер, на Amazon S3 .Для этого я:

  • Использую move_uploaded_file() для отправки файла в папку temp-uploads.
  • Я использую S3 SDK для загрузки файла в качестве объекта в S3.
  • Я использую unlink() для удаления файла.
  • unlink() не удается с Ресурс временно недоступен

Windows Server под управлением PHP /Apache.

Я могу отсоединиться позже, после того как скрипт завершит работу.Вызов команды unlink() вне сценария немедленно удаляет файл с сервера.Я пытался выяснить, как, возможно, выпустить файл из move_uploaded_file(), но не могу найти ничего после поиска.

Я использую $thumb1 = new Imagick($filetothumbnail); и создаю миниатюру.Но я тогда звоню

$thumb1->clear();
$thumb1->destroy();

Может, у Имаджика все еще открыт файл?Тем не менее, я проверил это с файлом Excel, который не создает миниатюру, и файл по-прежнему не удается удалить с сервера.

if(isset($_FILES['file'])){
  $name = $_FILES['file']['name'];
  $size = $_FILES['file']['size'];
  $tmp = $_FILES['file']['tmp_name'];
  $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));

  $newname = time().'_'.$j['id'].'_'.$name;
  $thumbname = 'tn_'.time().'_'.$j['id'].'_'.$name;
  move_uploaded_file($_FILES["file"]["tmp_name"], "temp-uploads/".$newname);

  //Now, generate thumbnail for the file:
  $filetothumbnail = $_SERVER['DOCUMENT_ROOT'].'/temp-uploads/'.$newname;
  $thumbnails = $_SERVER['DOCUMENT_ROOT'].'/temp-uploads/thumbs/';

  //Send to AWS Bucket
  $s3_filepath = 'project-assets/'.$newname;
  upload_s3_file($s3_filepath, "temp-uploads/".$newname);

  $filepath = s3url.$s3_filepath;

  if($ext == 'jpg' || $ext == 'jpeg' || $ext == 'png' || $ext == 'gif'){

  $thumb1 = new Imagick($filetothumbnail);
  $compression_type = Imagick::COMPRESSION_JPEG; 

  $thumb1->setImageCompression($compression_type); 
  $thumb1->setImageCompressionQuality(40);
  $thumb1->thumbnailImage(500, 0);
  $thumb1->setImageFormat('jpg');
  $thumb1->writeimage($thumbnails.$thumbname);
  $thumb1->clear();
  $thumb1->destroy();

  //If thumbnail is there. Only for certain file types.
  $s3_thumbpath = 'project-thumbnails/'.$thumbname;
  upload_s3_file($s3_thumbpath, "temp-uploads/thumbs/".$thumbname);

  unlink("temp-uploads/thumbs/".$thumbname); //Delete Thumbnail.

  $thumbpath = s3url.$s3_thumbpath;

  } else {
  $thumbpath = 0;
  }


  unlink("temp-uploads/".$newname); //Delete Uploaded File.
}

Функция загрузки на S3:

$s3Client = new S3Client([
  'version'     => 'latest',
  'region'      => 'us-east-2',
  'credentials' => [
     'key'    => s3key,
     'secret' => s3secret,
   ],
]);

$result = $s3Client->putObject([
  'Bucket' => 'bucketname',
  'Key' => $filename,
  'SourceFile' => $filepath,
]);

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Этот пост помог решить эту проблему для меня:

https://stackoverflow.com/a/41537354/1766536

В частности, мне пришлось использовать fopen / fclose и загрузить с использованием Body вместо SourceFile

0 голосов
/ 28 февраля 2019

Быстрый просмотр документов показывает, что загрузка выполняется асинхронно:

https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_promises.html

И вам, вероятно, следует использовать обещание для создания обратного вызова, при котором вы можете отсоединить свой файл.В ссылке множество примеров кода.

...