Я работаю над приложением, которое позволяет пользователям загружать изображение в систему, и мы храним это изображение в облачном хранилище (S3). В настоящее время после загрузки изображения мы обрабатываем их файл, копируя временный файл локально через move_uploaded_file()
, а затем используя этот локальный файл для загрузки его на S3. Является ли эта локальная копия необходимостью или можно отменить этот шаг и напрямую загрузить в облачное хранилище, даже не сохраняя локальную копию?
$temp = $_FILES['file']['tmp_name'];
$target = ABSPATH.'uploads/';
$name = $_FILES["file"]["name"];
$targetFile = $target . $name;
move_uploaded_file($temp,$targetFile);
//upload local file to s3
$this->saveToCloud($this->s3Path,$targetFile);
Прежде чем файл будет скопирован в локальное хранилище через move_uploaded_file
, он будет находиться в хранилище tmp php:
/Applications/MAMP/tmp/php/phpx3uBiT
Я бы хотел просто:
$this->saveToCloud($this->s3Path,$_FILES["file"]["tmp_name"]);
Заранее спасибо!
Мы используем SDK AWS S3 для загрузки файлов в облако через MultipartUploader()
, функция оболочки принимает путь и имя файла. Вот здесь и пригодится локальная копия, и это то, с чем у меня возникают трудности.
$this->saveToCloud($this->s3Path,$_FILES['file']['tmp_name']);
без move_uploaded_file
будет работать нормально (если это выполняется в том же запросе, что и загрузка файла, поскольку файл tmp удаляется при завершении запроса PHP).
@ drew010, если вы посмотрите на приведенный выше пример временного пути, это хэш без типа файла, когда я пытаюсь получить к нему доступ напрямую, он не найден.
Временный файл будет там только в течение срока действия PHP-запроса. Вероятно, поэтому вы не можете получить к нему доступ напрямую.
Если вы думаете о проблемах с производительностью, вам НЕ следует заботиться о move_uploaded_file
, потому что он просто выполняет некоторые проверки и просто переименовывает его в имя (путь). Потребление ЦП минимально. Если место назначения временного файла не находится на внешнем жестком диске и ему потребуется транспортировка по сети.
Если вы хотите облегчить серверный процесс, вы можете рассмотреть возможность использования AWS SDK Javascript для браузера и выполнить загрузку файла прямо из клиентского браузера в корзину S3 (проверьте эту ссылку, чтобы узнать, как это сделать: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-photo-album.html#s3-example-photo-album-adding-photos). Используя этот способ, вы должны принять во внимание создание HTTP-запроса только для сохранения информации о файле в вашей базе данных после / до загрузки файлов.
Если вас не интересует использование AWS SDK Javascript для браузера, вы можете попробовать:
$this->saveToCloud($this->s3Path,$_FILES['file']['tmp_name']);
но не уверен, работает ли, не пробовал.
надеюсь, это поможет
Пока облачное хранилище доступно пользователю веб-сервера, а путь и протокол совместимы с
move_uploaded_file()
, просто переместите его в облако.