Привет, если вы хотите, я буду поделиться моим вспомогательным классом, который я использовал для работы с изображениями в Yii2 REST.
В базовой папке приложения создайте компоненты папки и внутри этой папки создайте два помощника папок и объекты.
-->assets
-->componests
----->helpers
----->objects
-->config
-->...
после этого создайте класс FileUpload внутри папки объектов и поместите этот код внутри.
<?php
namespace app\components\objects;
class FileUpload
{
public $error=[];
public $isSuccess=false;
public $file;
public $ready_path;
public $file_type;
public $file_size;
public $file_extension;
public $file_tmp_name;
public $file_name;
public $save_path;
public function __construct($file,$save_path,$ready_path,$required=false)
{
if(!isset($_FILES[$file])){
if($required){
$this->error=['message'=>$file.' is required'];
}
return $this;
}
$this->save_path=$save_path;
$this->ready_path=$ready_path;
$this->file_type = strtolower($_FILES[$file]['type']);
$this->file_name = $_FILES[$file]['name'];
$this->file_tmp_name=$_FILES[$file]['tmp_name'];
$this->file_size = $_FILES[$file]['size'];
$this->file_extension=pathinfo($this->file_name, PATHINFO_EXTENSION);
}
public function setError($error){
if(empty($this->error)){
$this->error=$error;
}
}
}
Затем внутри папки помощников создайте класс FileUploadHelper, а затем введите этот код внутри.
<?php
namespace app\components\helpers;
use app\components\objects\FileUpload;
use Yii;
class FileUploadHelper
{
private $allowed_files;
private $file_size;
const IMAGE='image';
const FILE='file';
/** File Upload
* @param string $file_name
* @param string $save_path
* @param string $ready_path
* @param string $type
* @param bool $required
* @return \app\components\objects\FileUpload
*/
public static function fileUpload($file_name,$save_path,$ready_path,$type,$required=false){
$image=new FileUpload($file_name,$save_path,$ready_path,$required);
if($type==self::FILE){
$allowed_files=Yii::$app->params['allowed_files'];
$file_size=Yii::$app->params['file_max_size'];
}else{
$allowed_files=Yii::$app->params['allowed_files'];
$file_size=Yii::$app->params['file_max_size'];
}
$dir = realpath(Yii::$app->basePath);
if(in_array($image->file_type,$allowed_files)
&&$image->file_size<$file_size){
$filename = $file_name.'_'.md5(uniqid(time()).time() . '_' . date('YmdHis')) . '.' . $image->file_extension;
$file = $dir . $image->save_path . $filename;
if(move_uploaded_file($image->file_tmp_name, $file)){
$image->file=$image->ready_path. $filename;
$image->isSuccess=true;
$image->setError(['message'=>'file_upload_success']);
}else{
$image->setError(['message'=>'error_try_again']);
}
}else{
$image->setError(['message'=>'file_should_be_no_more_than_given_size']);
}
return $image;
}
/** Delete File
* @param string $ready_file
*/
public static function deleteImage($ready_file){
$dir = realpath(Yii::$app->basePath);
if (strpos($ready_file, 'default') === false){
if(is_file($dir.'/web/'.$ready_file)){
unlink($dir.'/web/'.$ready_file);
}
}
}
}
Это все необходимо. Ниже я приведу вам пример
public function actionEditAvatar($id)
{
$product = Product::findOne($id);
if($product){
$old_avatar=$product->avatar;
$image=FileUploadHelper::fileUpload(ProductForm::AVATAR,Yii::$app->params['product_path'],Yii::$app->params['product_ready_path'],FileUploadHelper::IMAGE);
if($image->isSuccess) {
$product->avatar = $image->file;
if($product->save()){
FileUploadHelper::deleteImage($old_avatar);
return $product->avatar;
}
}
return $image->error;
}
throw new NotFoundHttpException;
}
Код сверху от реального проекта. FileUploadHelper имеет два статических класса, которые являются «fileUpload» и «deleteImage». FileUploadHelper требует fileUpload ('имя_файла', 'save_path', 'ready_path', 'type') «save_path» - это файл, в котором будет сохранен файл. «ready_path» - как должен выглядеть готовый URL. они находятся в Yii :: $ app-> params [];
Вы можете проверить, было ли изображение успешным или нет атрибутом isSuccess. Если у вас есть ошибка, вы можете получить к ним доступ по ошибке атрибута. Доступ к готовому файлу возможен через файл атрибута. Вы можете удалить изображение с помощью статической функции deleteImage ('saved_image_url'); Все они используются при вышеуказанном действии. Пожалуйста, смотрите. Кстати, здесь параметры, которые я использовал. Не забудьте создать папки внутри web/uploads и изменить имена папок, как в файле конфигурации.
return [
'adminEmail' => '[email protected]',
'allowed_images' => [ 'image/jpeg', 'image/gif', 'image/png' ],
'allowed_files' => [ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/msword', 'application/pdf','image/jpeg', 'image/gif', 'image/png'],
'image_max_size' => 2097152,
'file_max_size' => 8388608,
'owner_document_path' => '/web/uploads/owner_document/',
'owner_document_ready_path' => 'uploads/owner_document/',
'product_path' => '/web/uploads/product/',
'product_ready_path' => 'uploads/product/',
'complain_photo_path' => '/web/uploads/complain_photo/',
'complain_photo_ready_path' => 'uploads/complain_photo/',
'owner_path' => '/web/uploads/owner/',
'owner_ready_path' => 'uploads/owner/',
'staff_path' => '/web/uploads/staff/',
'staff_ready_path' => 'uploads/staff/',
];
Вы можете предоставить полное сообщение об ошибке, а также где (номер строки может быть) он отображается? и btw, почему вы делаете то же самое дважды: это '$ model-> photo' и это' $ name' и this '$ model-> save()'! – leninhasda
Сначала спасибо за ваш ответ. Да $ name не требуется во второй раз, bt first $ model-> save(), сохранить только фотографию, второй проверить другие поля, сохранить или нет, а первая модель-> фотография, используемая для ввода ввода от пользователя, а вторая модель-> фото используется для переименования файла и сохранения в db. –
"C: \\ Проекты \\ htdocs \\ basic12 \\ контроллеры \\ ApiprofileController.php (67): yii \\ db \\ BaseActiveRecord-> save()" ,. это наша ошибка формата json –